Какова цель окончательного значения в Scala? [Дубликат]

Основы

Простейшим способом преобразования одного формата даты в другой является использование 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

Вы также можете преобразовать метку времени в секундах путем деления на 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');

29
задан 0__ 6 September 2012 в 23:06
поделиться

3 ответа

Это явно указано в спецификации , и они автоматически окончательны:

Члены конечных классов или объектов также неявно также окончательны, поэтому 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();
}

Вы видите то же самое, даже если правая часть определения значений не является постоянным выражением.

Итак, я оставлю свой ответ, но это не является окончательным.

22
ответ дан Travis Brown 25 August 2018 в 05:27
поделиться

Вы не спрашиваете: «Почему они не окончательные», вы спрашиваете: «Почему они не включены». Просто конечный результат заключается в том, как вы комментируете компилятор, что вы хотите, чтобы они были встроены.

Причина, по которой они не являются автоматически встроенными, - это отдельная компиляция.

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.

20
ответ дан psp 25 August 2018 в 05:27
поделиться

Чтобы решить центральный вопрос об окончательном объекте, я думаю, что это предложение из спецификации более актуально:

Определение постоянного значения имеет форму final val x = e, где e является постоянным выражением (§6.24). Последний модификатор должен присутствовать, и аннотация типа типа не может быть задана. Ссылки на постоянное значение x сами рассматриваются как постоянные выражения; в сгенерированном коде они заменяются правой частью e.

. Значение:

  • Аннотации типа не могут быть заданы
  • Выражение e используется в сгенерированном коде (моим чтением, как исходным неоцененным постоянным выражением)

Мне кажется, что компилятор требуется спецификацией для использования этих больше похоже на замену макросов, а не на значения, которые оцениваются на месте во время компиляции, что может повлиять на результат выполнения кода.

Я думаю, что особенно интересно, что аннотация типа типа не может быть задана.

Это, я думаю, указывает на наш окончательный ответ, хотя я не могу придумать пример, показывающий разницу во времени для этих требований. Фактически, в моем интерпретаторе 2.9.2 я даже не получаю принудительное выполнение первого правила.

1
ответ дан Tony K. 25 August 2018 в 05:27
поделиться