Я получаю события календаря Google через iCal, у которых есть такая дата:
'20240713T011500Z'
Обычным функциям PHP этот формат, похоже, не нравится. Эта функция работает, но кажется довольно неуклюжей. Нет ли встроенного способа работы с этим форматом?
function convertGCalDate($gdate){
$parts = explode('T', $gdate);
$date = $parts[0];
$nums = str_split($date);
$date = $nums[0].$nums[1].$nums[2].$nums[3].'-'.$nums[4].$nums[5].'-'.$nums[6].$nums[7];
$time = trim($parts[1], 'Z');
$zulu = str_ends_with($parts[1], 'Z');
$nums = str_split($time);
$newtime = $nums[0].$nums[1].':'.$nums[2].$nums[3].':'.$nums[4].$nums[5];
$dt = $date.' '.$newtime;
// this is my TZ func, it works, when I finally get the dt into the right format.
// $datetime = new DateTime($time);
// $datetime->setTimezone($that_tz);
// etc
$dt = getTimeInThisTimezone($dt, $thatTZ = 'Z', $thisTZ = 'America/Los_Angeles', $outformat = null);
return $dt;
//2024-07-12 7:15 pm
}
$whatIwant = convertGCalDate('20240713T011500Z');
Вы имели в виду DateTime::createFromFormat()?
«Обычным функциям PHP этот формат, похоже, не нравится» — я бы сказал, что нравится :-? 3v4l.org/Tntbv
Я предполагаю, что ввод правильно проверен. Я думаю, что date() и strtotine() должны помочь.
function convertGCalDate($gdate){
return echo date('Y-m-d H:i:s',strtotime($gdate));
}
Да, мне не хватало strtotime(), спасибо, друг.
Да, тебе не нужно этого делать. Вам, вероятно, также не нужно делать то, что указано в функции getTimeInThisTimezone()
.
var_dump(
$d = DateTimeImmutable::createFromFormat('Ymd\THisO', '20240713T011500Z'),
$d2 = $d->setTimezone(new DateTimezone('America/Vancouver')),
$d2->format('Y-m-d g:i a')
);
Выход:
object(DateTimeImmutable)#1 (3) {
["date"]=>
string(26) "2024-07-13 01:15:00.000000"
["timezone_type"]=>
int(2)
["timezone"]=>
string(1) "Z"
}
object(DateTimeImmutable)#3 (3) {
["date"]=>
string(26) "2024-07-12 18:15:00.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(17) "America/Vancouver"
}
string(18) "2024-07-12 6:15 pm"
Ссылка: https://www.php.net/manual/en/datetimeimmutable.createfromformat.php
Конечно, синтаксический анализ даты и времени имеет несколько канонических значений в Stack Overflow, верно?
Итак, createFromFormat()
точнее, чем strtotime()
? Strtotime() угадывает, а cFF() более прямой?
И буква О заменяет tz? Я не могу найти документы по этому поводу.
Да, strtotime()
угадывает формат, и спецификатор O
действительно есть в документах, на которые я ссылаюсь.
Вы можете использовать
Date::parseFromFormat()