IntlDateFormatter::localtime

datefmt_localtime

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)

IntlDateFormatter::localtime -- datefmt_localtime β€” Π Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ строку Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π² ассоциативном массивС

ОписаниС

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΡΡ‚ΠΈΠ»ΡŒ

public function IntlDateFormatter::localtime(string $string, int &$offset = null): array|false

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ ΡΡ‚ΠΈΠ»ΡŒ

function datefmt_localtime(IntlDateFormatter $formatter, string $string, int &$offset = null): array|false

Ѐункция ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ строку $value Π² массив ΠΏΠΎΠ»Π΅ΠΉ, ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… прСдставляСт ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Ѐункция Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ с ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ $parse_pos, с Π·Π°Ρ…Π²Π°Ρ‚ΠΎΠΌ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ большСй части Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ значСния.

Бписок ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

formatter

БрСдство форматирования.

string

Π‘Ρ‚Ρ€ΠΎΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ трСбуСтся ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π² массив ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

offset

ΠŸΠΎΠ·ΠΈΡ†ΠΈΡ, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ функция Π½Π°Ρ‡Π½Ρ‘Ρ‚ Ρ€Π°Π·Π±ΠΎΡ€ значСния $value, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ индСксация символов начинаСтся с нуля. Ѐункция присвоит ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ $parse_pos Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ -1, Ссли Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° Ρ€Π°Π·Π±ΠΎΡ€Π° строки $value Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΎ ошибок, ΠΈΠ½Π°Ρ‡Π΅ присвоит ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ закончился синтаксичСский Π°Π½Π°Π»ΠΈΠ·. Π Π°Π·Π±ΠΎΡ€ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ошибкой, Ссли выполняСтся условиС выраТСния $parse_pos > strlen($value).

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния

Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ массив цСлочислСнных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° массива совмСстима с Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠΌ прСдставлСния мСстного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ localtime: содСрТит 24-часовоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΏΠΎΠ»Π΅ tm_hour ΠΈΠ»ΠΈ false, Ссли Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ошибка.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #1 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ прСобразования строки Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° основС поля Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ datefmt_localtime()

<?php

$fmt
= datefmt_create(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);

$arr = datefmt_localtime($fmt, 'Wednesday, December 31, 1969 at 4:00:00 PM Pacific Standard Time', $offset);

echo
'Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π·Π±ΠΎΡ€Π°: ';
if (
$arr) {
foreach (
$arr as $key => $value) {
echo
"$key : $value, ";
}
}

?>

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #2 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ стилС

<?php

$fmt
= new IntlDateFormatter(
'en_US',
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
'America/Los_Angeles',
IntlDateFormatter::GREGORIAN
);

$arr = $fmt->localtime('Wednesday, December 31, 1969 at 4:00:00 PM Pacific Standard Time', $offset);

echo
'Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π·Π±ΠΎΡ€Π°: ';
if (
$arr) {
foreach (
$arr as $key => $value) {
echo
"$key: $value, ";
}
}

?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π·Π±ΠΎΡ€Π°: tm_sec: 0, tm_min: 0, tm_hour: 16, tm_year: 69, tm_mday: 31, tm_wday: 3, tm_yday: 365, tm_mon: 11, tm_isdst: 0,

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅

  • datefmt_create() - Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ срСдство форматирования Π΄Π°Ρ‚Ρ‹
  • datefmt_format() - Π€ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΊΠ°ΠΊ строку
  • datefmt_parse() - ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ строку Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ
  • datefmt_get_error_code() - ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΊΠΎΠ΄ ошибки послСднСй ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ
  • datefmt_get_error_message() - ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ тСкст ошибки послСднСй ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ
οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ 2 notes

up
0
Patanjali ΒΆ
9 years ago
Learning lesson here: Never trust the PHP documentation. Test everything!

$position does not work as described, at least in PHP 7. After parsing without errors, it does not contain -1.

You can still use it to set the parsing start character position, but not necessarily whether any errors occurred.

To test for errors, replace my $nPosition test code in the other note with:
<?php 
// Check if errors
$bError = intl_is_failure(datefmt_get_error_code(oIDF));

// If no error
if(!$bError){
 // Use 'tm_hour' and 'tm_min' from the $aTime array for checking against other time values
 ...
}else{
 // Invalid string
 ...
}
?>
up
0
Patanjali ΒΆ
9 years ago
You can use datefmt_localtime to convert a user's time string, input using their locale's script, into standard numbers for checking, using a simple HTML input element.

This avoids using clunky HTML select elements formatted with hour and minute options in the locale's script to capture user input.

<?php
// Specify locale of user
$sLocale = 'en-us'; // US English user
$sLocale = 'ar-ye'; // Yemen Arab user

// Create a date formatter for the user's locale
$oIDF = datefmt_create($sLocale, IntlDateFormatter::NONE, IntlDateFormatter::SHORT);

// Simulate a user's time input string
$sTime = datefmt_format($oIDF, ['tm_hour'=>15, 'tm_min'=>25]);
// For a US English user, $sTime = '3:25 PM'
// For a Yemen Arab user, $sTime = 'Ω£:Ω’Ω₯ Ω…'

// Specify datefmt_locale parsing start at the beginning of the user input
$nPosition = 0;

// Convert input time string to array of standard numeric values, as per localtime() output (http://php.net/manual/en/function.localtime.php)
$aTime = datefmt_localtime($oIDF, $sTime, $nPosition);
// If no errors, $nPosition set to -1 after parsing, else character position of error

// If valid string
if($nPosition = -1){
 // Use 'tm_hour' and 'tm_min' from the $aTime array for checking against other time values
 ...
}else{
 // Invalid string
 ...
}
?>