Основы
Простейшим способом преобразования одного формата даты в другой является использование strtotime()
с date()
. strtotime()
преобразует дату в метку Unix . Затем отметку времени Unix можно передать в date()
, чтобы преобразовать ее в новый формат.
$timestamp = strtotime('2008-07-01T22:35:17.02');
$new_date_format = date('Y-m-d H:i:s', $timestamp);
Или как однострочный:
$new_date_format = date('Y-m-d H:i:s', strtotime('2008-07-01T22:35:17.02'));
Имейте в виду, что strtotime()
требует, чтобы дата была в допустимом формате , Невозможность предоставить допустимый формат приведет к тому, что strtotime()
вернет false, что приведет к тому, что ваша дата будет 1969-12-31.
Использование DateTime()
Начиная с PHP 5.2, PHP предложил класс DateTime()
, который предлагает нам более мощные инструменты для работы с датами (и временем). Мы можем переписать приведенный выше код с помощью DateTime()
следующим образом:
$date = new DateTime('2008-07-01T22:35:17.02');
$new_date_format = $date->format('Y-m-d H:i:s');
Работа с временными метками Unix
date()
принимает Unix timeatamp в качестве второго параметра и возвращает форматированную дату для вас:
$new_date_format = date('Y-m-d H:i:s', '1234567890');
DateTime () работает с отметками времени Unix, добавив @
перед меткой времени:
$date = new DateTime('@1234567890');
$new_date_format = $date->format('Y-m-d H:i:s');
Если метка времени у вас есть в миллисекундах (она может заканчиваться на 000
и / или метка времени составляет тринадцать символов), вам нужно будет преобразовать ее в несколько секунд, прежде чем вы сможете преобразовать ее в другой формат. Это можно сделать двумя способами:
substr()
Обрезка последних трех цифр может быть достигнуто несколькими способами, но использование substr()
является самым простым:
$timestamp = substr('1234567899000', -3);
Вы также можете преобразовать метку времени в секундах путем деления на 1000. Поскольку временная метка слишком велика для 32-битных систем для математики, вам нужно будет использовать библиотеку BCMath для выполнения математики как строки:
$timestamp = bcdiv('1234567899000', '1000');
Чтобы получить временную метку Unix, вы можете использовать strtotime()
, который возвращает отметку времени Unix:
$timestamp = strtotime('1973-04-18');
С помощью функции DateTime () вы можете использовать DateTime::getTimestamp()
$date = new DateTime('2008-07-01T22:35:17.02');
$timestamp = $date->getTimestamp();
Если вы используете PHP 5.2, вы можете использовать опцию форматирования U
:
$date = new DateTime('2008-07-01T22:35:17.02');
$timestamp = $date->format('U');
Работа с нестандартными и неоднозначными форматами даты
К сожалению, не все даты, с которыми разработчик должен работать, находятся в стандартном формате. К счастью, PHP 5.3 предоставил нам решение для этого. DateTime::createFromFormat()
позволяет нам рассказать PHP о том, в каком формате используется строка даты, чтобы ее можно было успешно проанализировать в объект DateTime для дальнейших манипуляций.
$date = DateTime::createFromFormat('F-d-Y h:i A', 'April-18-1973 9:48 AM');
$new_date_format = $date->format('Y-m-d H:i:s');
В PHP 5.4 мы получила возможность делать доступ к членам класса при создании экземпляра, что позволяет нам превратить наш код DateTime()
в однострочный:
$new_date_format = (new DateTime('2008-07-01T22:35:17.02'))->format('Y-m-d H:i:s');
$new_date_format = DateTime::createFromFormat('F-d-Y h:i A', 'April-18-1973 9:48 AM')->format('Y-m-d H:i:s');
Это явно указано в спецификации , и они автоматически окончательны:
Члены конечных классов или объектов также неявно также окончательны, поэтому
blockquote>final
модификатор, как правило, также избыточен для них. Однако обратите внимание, что для определения постоянных значений (§ 4.1) требуется явный модификаторfinal
, даже если они определены в конечном классе или объекте.Ваш
final
-less пример компилируется без ошибок (или предупреждений) с помощью 2.10-M7, поэтому я предполагаю, что существует проблема с проверкой@switch
в более ранних версиях и что члены фактически являются окончательными.
Обновление: на самом деле это более любопытно, чем я ожидал, - если мы скомпилируем следующее: либо 2.9.2, либо 2.10-M7:
object NonFinal { val a = 0 } object Final { final val a = 0 }
javap
показывает разницу:public final class NonFinal$ implements scala.ScalaObject { public static final NonFinal$ MODULE$; public static {}; public int a(); } public final class Final$ implements scala.ScalaObject { public static final Final$ MODULE$; public static {}; public final int a(); }
Вы видите то же самое, даже если правая часть определения значений не является постоянным выражением.
Итак, я оставлю свой ответ, но это не является окончательным.
Вы не спрашиваете: «Почему они не окончательные», вы спрашиваете: «Почему они не включены». Просто конечный результат заключается в том, как вы комментируете компилятор, что вы хотите, чтобы они были встроены.
Причина, по которой они не являются автоматически встроенными, - это отдельная компиляция.
object A { final val x = 55 }
object B { def f = A.x }
Когда вы компилируете это, Bf возвращает 55, буквально:
public int f();
0: bipush 55
2: ireturn
Это означает, что если вы перекомпилируете A, B не обратит внимания на изменение. Если x не отмечен окончательным в A, B.f выглядит следующим образом:
0: getstatic #19 // Field A$.MODULE$:LA$;
3: invokevirtual #22 // Method A$.x:()I
6: ireturn
Кроме того, чтобы исправить один из других ответов, final не означает неизменяемость в scala.
Чтобы решить центральный вопрос об окончательном объекте, я думаю, что это предложение из спецификации более актуально:
Определение постоянного значения имеет форму final val x = e, где e является постоянным выражением (§6.24). Последний модификатор должен присутствовать, и аннотация типа типа не может быть задана. Ссылки на постоянное значение x сами рассматриваются как постоянные выражения; в сгенерированном коде они заменяются правой частью e.
blockquote>. Значение:
- Аннотации типа не могут быть заданы
- Выражение e используется в сгенерированном коде (моим чтением, как исходным неоцененным постоянным выражением)
Мне кажется, что компилятор требуется спецификацией для использования этих больше похоже на замену макросов, а не на значения, которые оцениваются на месте во время компиляции, что может повлиять на результат выполнения кода.
Я думаю, что особенно интересно, что аннотация типа типа не может быть задана.
Это, я думаю, указывает на наш окончательный ответ, хотя я не могу придумать пример, показывающий разницу во времени для этих требований. Фактически, в моем интерпретаторе 2.9.2 я даже не получаю принудительное выполнение первого правила.