【发布时间】:2015-10-04 15:34:18
【问题描述】:
我正在构建一个多语言网站,该网站将以英语和俄语显示。除日期外,翻译方面的一切都运行良好。
据我了解,PHP 的 strtotime() 函数严格用于英文日期,正如官方文档“Parse about any English textual datetime description into a Unix timestamp”中所说。
我已经尝试过使用setlocale( LC_TIME, 'ru_RU', 'russian' );,然后使用strftime(),但它只是不断返回unix January 1970 日期。
我试图做的是从日期中获取日期名称(即星期三)并显示它。通常情况下,如果是英文日期,我会像 $this->day = date('l', strtotime( $date )); 那样做,但因为我试图同时使用英语和俄语,所以我会这样做 $this->day = strftime("%A", strtotime($date) );
我的日期格式为“2015 年 10 月 13 日”之类的字词,我认为这是问题的一部分,因为“十月”的俄语翻译是“Октябрь”所以最终结果是我最终尝试解析的是“Октябрь 13, 2015”,它总是返回“Thursday”,而实际上 10 月 13 日是星期二。
这是我为解析日期所做的一切:
$this->month_arr = array();
// Loop through $event_dates array created above
if(isset($_GET['lang']) && $_GET['lang'] == 'ru') {
setlocale(LC_ALL, 'ru_RU.utf8', 'rus_RUS.1251', 'rus', 'russian');
}
foreach($this->event_dates as $date => $time) {
// Create the unix timestamp to parse with PHP
$unix_date = strtotime($date);
$this->month = strftime("%B", $unix_date);
$this->day = strftime("%A", $unix_date);
$this->year = strftime("%G", $unix_date);
// Create new array with date info
$this->month_arr[$this->month][] = $this->day; // Day of week
$this->month_arr[$this->month][] = $date; // Full textual date
$this->month_arr[$this->month][] = $this->year; // 4 Digit Year
$this->month_arr[$this->month][] = $time; // Start/end time array
}
这完美地解析了日期的英文表示,但其他一切似乎都搞砸了。作为临时后备,我从最终显示中删除了星期几,只是从初始日期字符串中删除“October”或“Октябрь”并显示它,但这不是客户所期望的。
我也尝试过这种格式:strftime('%B %e, %Y', $unix_date);,希望将strftime() 格式与最初显示日期的方式相匹配,但这给了我相同的最终结果。
附:我在我的本地主机 MAMP 服务器上运行这一切。生产/登台服务器在 nginx 上运行。
编辑:这是一个 WordPress 网站,日期是通过“Advanced Custom Fields Pro”插件创建的。该插件不允许用户将日期保存为时间戳。我已经尝试过使用 WP 内置的 date_i18n($format, $unix_timestamp); 函数,但没有成功。
EDIT x2:我目前正在做这样的事情:
// Russian Months
$ru_months = array( 'Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь' );
// English Months
$en_months = array( 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' );
// Get date string from ACF
$date_arr = explode(" ", get_sub_field('date'));
// Get the month name
$month = $date_arr[0];
// Get the array index of the month name
$month_index = array_search($month, $en_months);
// Piece together new date string in Russian translation
$date = $ru_months[$month_index] . " " . $day . ", " . $year;
目前可行,但我也想翻译日期名称。例如,2015 年 10 月 13 日,星期二,这种方法不能提供可靠的方法。
【问题讨论】:
-
谢谢@PaulCrovella,我会调查的。
-
只是为了上下文,日期存储为格式化字符串而不是时间戳是否有原因?您能否提供一些
$this->event_dates内部的样本以便对其进行测试? -
我还要指出
1970-01-01 00:00:00 UTC,其时间戳等于0 == null == false,是星期四。 -
@spenibus 日期以字符串形式出现,因为它是使用“高级自定义字段专业版”WordPress 插件创建的,该插件不允许您将日期保存为时间戳。我修改了我的问题,以便更好地了解环境。
-
日期来自某种形式的存储?它们以任何一种语言存储?它们是从 ACF 日期选择器中保存的?
标签: php date datetime localization multilingual