PHP Conference Japan 2024

IntlDateFormatter::localtime

datefmt_localtime

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

IntlDateFormatter::localtime -- datefmt_localtime將字串剖析為基於欄位的時間值

說明

物件導向風格

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

程序式風格

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

將字串 $value 轉換為基於欄位的時間值(一個包含各種欄位的陣列),從 $parse_pos 開始,並盡可能地使用輸入值。

參數

formatter

格式器資源

string

要轉換為時間的字串

offset

在 $value 中開始解析的位置(從零開始)。如果在 $value 被使用完之前沒有發生錯誤,$parse_pos 將包含 -1,否則它將包含解析結束的位置。如果 $parse_pos > strlen($value),解析將立即失敗。

返回值

與 localtime 相容的整數陣列:tm_hour 欄位包含 24 小時制的值,失敗時返回 **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 4:00:00 PM PT', 0);
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 4:00:00 PM PT', 0);
echo
'First parsed output is ';
if (
$arr) {
foreach (
$arr as $key => $value) {
echo
"$key : $value , ";
}
}

?>

以上範例會輸出

First parsed output is tm_sec : 0 , tm_min : 0 , tm_hour : 16 , tm_year : 1969 , 
tm_mday : 31 , tm_wday : 4 , tm_yday : 365 , tm_mon : 11 , tm_isdst : 0 ,

另請參閱

新增註解

使用者貢獻的註解 2 則註解

0
Patanjali
7 年前
學習的教訓:永遠不要相信 PHP 文件。所有東西都要測試!

`$position` 的運作方式與描述不符,至少在 PHP 7 中是如此。在沒有錯誤的情況下解析後,它並不包含 -1。

您仍然可以使用它來設定解析的起始字元位置,但不一定表示是否發生任何錯誤。

要測試錯誤,請將我在另一個註解中的 `$nPosition` 測試程式碼替換為
<?php
// 檢查是否有錯誤
$bError = intl_is_failure(datefmt_get_error_code(oIDF));

// 如果沒有錯誤
if( !$bError ){
// 使用 $aTime 陣列中的 'tm_hour' 和 'tm_min' 來與其他時間值進行比較
...
} else {
// 字串無效
...
}
?>
0
Patanjali
7 年前
您可以使用 `datefmt_localtime` 將使用者使用其地區設定腳本輸入的時間字串轉換為標準數字以進行檢查,只需使用簡單的 HTML 輸入元素即可。

這避免了使用笨重的 HTML 選擇元素(使用地區設定腳本中的小時和分鐘選項格式化)來擷取使用者輸入。

<?php
// 指定使用者地區
$sLocale = 'en-us'; // 美國英語使用者
$sLocale = 'ar-ye'; // 葉門阿拉伯語使用者

// 建立使用者地區的日期格式器
$oIDF = datefmt_create($sLocale, IntlDateFormatter::NONE, IntlDateFormatter::SHORT);

// 模擬使用者輸入的時間字串
$sTime = datefmt_format($oIDF, ['tm_hour'=>15, 'tm_min'=>25]);
// 對於美國英語使用者,$sTime = '3:25 PM'
// 對於葉門阿拉伯語使用者,$sTime = '٣:٢٥ م'

// 指定 datefmt_locale 解析從使用者輸入的開頭開始
$nPosition = 0;

// 將輸入的時間字串轉換為標準數值陣列,如同 localtime() 輸出 (https://php.dev.org.tw/manual/en/function.localtime.php)
$aTime = datefmt_localtime($oIDF, $sTime, $nPosition);
// 如果沒有錯誤,解析後 $nPosition 設定為 -1,否則為錯誤的字元位置

// 如果是有效的字串
if($nPosition = -1){
// 使用 $aTime 陣列中的 'tm_hour' 和 'tm_min' 來與其他時間值進行比較
...
}else{
// 無效的字串
...
}
?>
To Top