Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用PHP将英语日期转换成俄语_Php_Date_Datetime_Localization_Multilingual - Fatal编程技术网

用PHP将英语日期转换成俄语

用PHP将英语日期转换成俄语,php,date,datetime,localization,multilingual,Php,Date,Datetime,Localization,Multilingual,我正在建立一个多语言的网站,将显示在英语和俄语。翻译方面的一切都很好,除了日期 据我所知,PHP的strotime()函数严格适用于官方文档中所述的英语日期 我已经尝试过使用setlocale(LC_-TIME,'ru_-ru,'rus')然后strftime()但它只是不断返回unix1970年1月的日期 我试图做的是从日期中获取日期名称(即星期三)并显示它。通常,对于英文日期,我会像$this->day=date('l',strotime($date))但是因为我尝试用英语和俄语来做,所以我

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

据我所知,PHP的
strotime()
函数严格适用于官方文档中所述的英语日期

我已经尝试过使用
setlocale(LC_-TIME,'ru_-ru,'rus')
然后
strftime()
但它只是不断返回unix
1970年1月的日期

我试图做的是从日期中获取日期名称(即星期三)并显示它。通常,对于英文日期,我会像
$this->day=date('l',strotime($date))但是因为我尝试用英语和俄语来做,所以我是这样做的
$this->day=strftime(“%A”,strotime($date))

我的日期格式是“2015年10月13日”,我假设这是问题的一部分,因为“十月”的俄语翻译是“十月”,所以我最终尝试解析的结果是“2015年10月13日”,它总是返回“星期四”,而实际上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
}
这完美地解析了日期的英文表示,但其他一切似乎都搞糟了。作为一种暂时的回退,我已经从最终显示中删除了一周中的某一天,只是从初始日期字符串中去掉了“十月”或“十月”并显示出来,但这不是客户所期望的

我也尝试过这种格式:
strftime('%B%e,%Y',$unix\u date)
希望将
strftime()
格式与最初显示日期的方式相匹配,但这给了我相同的最终结果

另外,我正在本地主机MAMP服务器上运行这一切。生产/暂存服务器正在nginx上运行

编辑:这是一个WordPress网站,日期是通过“”插件创建的。该插件不允许用户将日期保存为时间戳。我已经尝试过使用WP内置的
date\ui18n($format,$unix\u 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日星期二,此方法无法提供可靠的方法。

您的理解是正确的:
strotime()
仅将英文字符串解析为整数。您可能没有注意到,当函数无法进行转换时,它会返回布尔值false:

$date = "October 13, 2015";
$rudate = "октября 13, 2015";
var_dump(strtotime( $date )); //outputs int(1444687200)
var_dump(strtotime( $rudate )); //ouputs bool(false)
当您尝试使用布尔值调用
date()
strftime()
时,PHP出于任何原因决定默认为某个日期,恰好是星期四

var_dump(date('l', false)); //outputs string(8) "Thursday"
var_dump(strftime("%A", false)); //outputs string(8) "Thursday"
由于您的数据已经存储,您必须先对其进行变异,然后才能使用现有的PHP函数对其进行处理。由于您只需将俄语翻译成英语,因此这种变化相当轻松:

//You should, of course, add the other months in.
function dateToEnglish($str)
{
    $str = str_replace('января', 'January', $str);
    //...
    $str = str_replace('октября', 'October', $str);
    //...
    $str = str_replace('Декабрь', 'December', $str);

    return $str;
}

var_dump(strtotime(dateToEnglish($rudate))); //outputs int(1444687200)
在进一步处理之前,您可以使用此选项将日期解析为英语:

foreach($this->event_dates as $date => $time) {

    // Create the unix timestamp to parse with PHP
    $unix_date = strtotime(dateToEnglish($date));
    // ...
}

您想要支持的每种语言都需要手动添加,这是此策略的一个主要缺点。然而,您处理这个问题的方法有一些严重的问题,因为您使用字符串而不是时间戳


将来,您应该将日期存储为时间戳(请参阅),因为它们与语言无关,不需要额外的处理步骤。

我在这里看到三个选项


  • 编写自己的解析器。
  • 您可以自己编写PHP代码来转换日期。 这是肮脏的,这是野蛮的力量,但它是直截了当的

    function add_weekday($date){
    $ruаU平日=阵列('Пбббббббббббббббббббббббб;
    $en_weekdays=数组('Monday','周二','周三','周四','Friday','Saturday','Sunday');
    $ruаu months=数组('1071;ааааааааа'、'Фаааа'、'Маааа'、'Маааааааа'、';
    $en_months=数组('一月'、'二月'、'三月'、'四月'、'五月'、'六月'、'七月'、'八月'、'九月'、'十月'、'十一月'、'十二月');
    $en_date=str_replace($ru_months,$en_months,$date);
    $weekdays=$en_date===$date?$en_weekdays:$ru_weekdays;
    //$wday=strtime($en_date,'%B%e,%Y');//Linux/Mac
    //返回$weekdays[$wday['tm_wday']-1]。“$date”;//Linux/Mac
    返回$weekdays[DateTime::createFromFormat('mj,Y',$en_date)->format('N')-1]。“$date”;//PHP5.3+
    }
    echo在工作日(2015年13月13日);//Вторник Октябрь 13, 2015
    echo add_工作日(“2015年10月13日”);//2015年10月13日星期二
    

  • 使用库。
  • 例如,有一个:

    $formatter=新的IntlDateFormatter('ru',IntlDateFormatter::LONG,IntlDateFormatter::NONE);
    $datetime=$formatter->parse(“13ббббб2015 r.”;
    $weekday=$datetime->format('l');/'星期二的
    
    然而,intl非常挑剔;日期字符串必须与其精确格式匹配: 无大写字母,无o挈挈挈,日期必须在月份之前,并且必须以“r”结尾

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


  • 企业数据库。
  • 我爱你。看:

    选择datename(dw,尝试解析(N'öСбббб132015'作为日期,使用'Ru-Ru');
    --“星期二”,如果默认语言为英语
    设置语言为“俄语”;
    选择datename(dw,尝试解析(N'Схббб13,2015'作为日期));
    -- 'вторник'
    
    或者,也可以完成工作:

    选择到字符(到日期('öбСбб)?
    
    date_default_timezone_set('Europe/Moscow');
    $ruDate = 'Октябрь 13, 2015';
    $enDate = DateTime::createFromFormat('F j, Y', ruMonthsToEn($ruDate));
    echo  $enDate->format('l, F, j, Y');
    //Tuesday, October, 13, 2015
    echo  $enDate->getTimestamp();
    //1444764954
    
    function ruMonthsToEn($date){
        $ruMonths = array( 'Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь' );
        $enMonths = array( 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' );
        return str_replace($ruMonths, $enMonths, $date);
    }