gpt4 book ai didi

php - 使用 PHP 将英语日期转换为俄语

转载 作者:可可西里 更新时间:2023-11-01 13:14:23 28 4
gpt4 key购买 nike

我正在构建一个将以英语和俄语显示的多语言网站。翻译方面的一切都很好,除了日期。

据我所知,PHP 的 strtotime() 函数严格用于英文日期,正如官方文档“Parse about any English textual datetime description into a Unix timestamp”中所说。

我已经尝试使用 setlocale( LC_TIME, 'ru_RU', 'russian' ); 然后 strftime() 但它只是不断返回 unix 1970 年 1 月 日期。

我想做的是从日期中获取日期名称(即星期三)并显示它。通常,对于英语日期,我会像 $this->day = date('l', strtotime( $date )); 那样做,但是因为我想同时使用英语和俄语我是这样做的 $this->day = strftime("%A", strtotime($date) );

我的日期格式为“2015 年 10 月 13 日”,我认为这是问题的一部分,因为“十月”的俄语翻译是“Октябрь”所以最终结果是我最终尝试解析的是“Октябрь 13, 2015”,它总是返回“星期四”,而实际上 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); 函数,但没有成功。

编辑 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 日,星期二,此方法并未提供执行该操作的可靠方法。

最佳答案

我在这里看到三个选项。


  1. 编写您自己的解析器。

您始终可以自己编写 PHP 代码来转换日期。这是肮脏的,是蛮力,但它是直截了当的。

function add_weekday( $date ) {
$ru_weekdays = array( 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота', 'Воскресенье' );
$en_weekdays = array( 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday' );
$ru_months = array( 'Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь' );
$en_months = array( 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' );
$en_date = str_replace( $ru_months, $en_months, $date );
$weekdays = $en_date === $date ? $en_weekdays : $ru_weekdays;
// $wday = strptime( $en_date, '%B %e, %Y' ); // Linux/Mac
// return $weekdays[ $wday['tm_wday']-1 ]." $date"; // Linux/Mac
return $weekdays[ DateTime::createFromFormat( 'M j, Y', $en_date )->format( 'N' )-1 ]." $date"; // PHP 5.3+
}
echo add_weekday( 'Октябрь 13, 2015' ); // Вторник Октябрь 13, 2015
echo add_weekday( 'October 13, 2015' ); // Tuesday October 13, 2015

  1. 使用图书馆。

例如,PECL intl module有一个 IntlDateFormatter :

$formatter = new IntlDateFormatter( 'ru', IntlDateFormatter::LONG, IntlDateFormatter::NONE );
$datetime = $formatter->parse( "13 октября 2015 r." );
$weekday = $datetime->format( 'l' ); // 'Tuesday'

但是intl非常挑剔;日期字符串必须与其精确 格式匹配:没有大写字母,没有 oктябрь,日期必须在月份之前,并且必须以“r.”结尾。

如果你问我,不够灵活,值得麻烦。


  1. Ask一个企业数据库。

我爱SQL Server .看:

SELECT datename( dw, Try_Parse( N'Октябрь 13, 2015' AS date USING 'Ru-RU' ) );
-- 'Tuesday', if default language is English

SET LANGUAGE 'Russian';
SELECT datename( dw, Try_Parse( N'Октябрь 13, 2015' AS date ) );
-- 'вторник'

Oracle , 也完成了工作:

SELECT TO_CHAR( TO_DATE( 'Октябрь 13, 2015', 'MON DD, YYYY', 'nls_date_language = Russian' )
, 'DAY', 'nls_date_language = Russian' ) FROM DUAL;
-- 'ВТОРНИК'

ALTER SESSION SET NLS_LANGUAGE = 'RUSSIAN';
SELECT TO_CHAR( TO_DATE( 'Октябрь 13, 2015', 'MON DD, YYYY' ), 'DAY' ) FROM DUAL;
-- 'ВТОРНИК'

您不需要任何 i18n 模块 - 它们已内置。

MySQL cannot parse international date - just like PHP.

我知道最常见的配置不会为您提供 SQL Server 或 Oracle,但它们是免费的,您不需要将它们用作主数据库。设置并连接它们后,许多日期时间 i18n 问题都可以通过单个查询解决。

但是要小心。我就是这样fell in love使用 SQL Server。

关于php - 使用 PHP 将英语日期转换为俄语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32935191/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com