System.currentTimeMillis () по сравнению с новой Датой () по сравнению с Calendar.getInstance () .getTime ()

Примечание: Неопределенный индекс

Случается, когда вы пытаетесь получить доступ к массиву с помощью ключа, который не существует в массиве.

Типичным примером для уведомления Undefined Index будет ( demo )

$data = array('foo' => '42', 'bar');
echo $data['spinach'];
echo $data[1];

Оба spinach и 1 не существуют в массив, вызывающий запуск E_NOTICE .

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

$data = array('foo' => '42', 'bar');
if (array_key_exists('spinach', $data)) {
    echo $data['spinach'];
}
else {
    echo 'No key spinach in array';
}

Если у вас есть код например:


...

, тогда $_POST['message'] не будет установлена, когда эта страница будет загружена первой, и вы получите указанную выше ошибку. Только когда форма будет отправлена ​​и этот код будет запущен во второй раз, будет существовать индекс массива. Вы обычно проверяете это с помощью:

if ($_POST)  ..  // if the $_POST array is not empty
// or
if ($_SERVER['REQUEST_METHOD'] == 'POST') ..  // page was requested with POST

Вопросы, относящиеся:

230
задан Vihung 1 July 2019 в 03:55
поделиться

5 ответов

System.currentTimeMillis(), очевидно, большинство эффективный , так как это даже не создает объект, но new Date() действительно просто тонкая обертка о длинном, таким образом, это не далеко позади. Calendar, с другой стороны, является относительно медленным и очень сложным, так как это должно иметь дело со значительно сложность и все причуды, которые свойственны к датам и времени (високосные годы, переход на летнее время, часовые пояса, и т.д.).

Это - обычно хорошая идея иметь дело только с долгими метками времени или Date объекты в рамках Вашего приложения, и только использовать Calendar, когда на самом деле необходимо выполнить вычисления даты/времени, или отформатировать даты отображения их пользователю. Если необходимо сделать многое из этого, с помощью , Время Joda является, вероятно, хорошей идеей для более чистой интерфейсной и лучшей производительности.

235
ответ дан ROMANIA_engineer 23 November 2019 в 03:41
поделиться

Рассмотрение JDK, у самого внутреннего конструктора для Calendar.getInstance() есть это:

public GregorianCalendar(TimeZone zone, Locale aLocale) {
    super(zone, aLocale);
    gdate = (BaseCalendar.Date) gcal.newCalendarDate(zone);
    setTimeInMillis(System.currentTimeMillis());
}

, таким образом, это уже автоматически делает то, что Вы предлагаете. Конструктор по умолчанию даты содержит это:

public Date() {
    this(System.currentTimeMillis());
}

, Таким образом, действительно нет потребности получить системное время конкретно, если Вы не хотите сделать некоторую математику с ним прежде, чем создать Ваш объект Календаря/Даты с ним. Также я действительно должен рекомендовать joda-разовый использовать в качестве замены для собственных классов календаря/даты Java, если Ваша цель состоит в том, чтобы работать с вычислениями даты много.

42
ответ дан Esko 23 November 2019 в 03:41
поделиться

Если Вы ИСПОЛЬЗУЕТЕ дату тогда, я настоятельно рекомендую использовать jodatime, http://joda-time.sourceforge.net/ . Используя System.currentTimeMillis() для полей, которые являются , даты походят на очень плохую идею, потому что Вы закончите с большим количеством бесполезного кода.

И дата и календарь серьезно borked, и Календарь является определенно худшим исполнителем их всех.

я советовал бы Вам использовать System.currentTimeMillis(), когда Вы на самом деле действуете с миллисекундами, например, как это

 long start = System.currentTimeMillis();
    .... do something ...
 long elapsed = System.currentTimeMillis() -start;
22
ответ дан ROMANIA_engineer 23 November 2019 в 03:41
поделиться

Я предпочитаю использовать значение, возвращенное System.currentTimeMillis() для всех видов вычислений, и только использую Calendar или Date, если я должен действительно отобразить значение, которое читается людьми. Это также предотвратит 99% Ваших ошибок летнего времени.:)

12
ответ дан Bombe 23 November 2019 в 03:41
поделиться

В зависимости от Вашего приложения можно хотеть рассмотреть использование System.nanoTime() вместо этого.

7
ответ дан MykennaC 23 November 2019 в 03:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: