Date.getTime () не включая время?

Не могу понять, почему происходит следующее:

String date = "06-04-2007 07:05";
SimpleDateFormat fmt = new SimpleDateFormat("MM-dd-yyyy HH:mm");
Date myDate = fmt.parse(date); 

System.out.println(myDate);  //Mon Jun 04 07:05:00 EDT 2007
long timestamp = myDate.getTime();
System.out.println(timestamp); //1180955100000 -- where are the milliseconds?

// on the other hand...

myDate = new Date();
System.out.println(myDate);  //Tue Sep 16 13:02:44 EDT 2008
timestamp = myDate.getTime();
System.out.println(timestamp); //1221584564703 -- why, oh, why?

Секунд тоже нет, потому что вы не указали дату!

Peter Lawrey 15.03.2009 09:42

Я вижу их там, последние три нуля. Вы неявно установили для них 0.

Daniel F 15.09.2015 10:00
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
7
2
46 782
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Ответ принят как подходящий

Какие миллисекунды? В первом примере вы предоставляете информацию только о минутах, тогда как во втором примере текущая дата из системы извлекается с помощью миллисекунд. Что вы ищете?

String date = "06-04-2007 07:05:00.999";
SimpleDateFormat fmt = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss.S");
Date myDate = fmt.parse(date);

System.out.println(myDate); 
long timestamp = myDate.getTime();
System.out.println(timestamp);

Нет ни секунд, ни минут, ни часов! getTime () возвращает только длинное целое число, представляющее дату с 00:00:00. Нет возможности парсить секунды: в моих данных их просто нет. знак равно

Jake 16.09.2008 21:26

Почему бы вам не открыть новый вопрос с вашим реальным кодом и небольшими примерами данных, если это не разрешило ваши сомнения? Думаю, твоя проблема может быть где-то в другом месте.

Vinko Vrsalovic 16.09.2008 21:41

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

ScArcher2 16.09.2008 22:17

Да, я понял, что был глупым. Я печатал объект, и он отображал только дату, несмотря на наличие данных времени. Спасибо за помощь!

Jake 17.09.2008 06:49

Поскольку простой формат даты, который вы указали, отбрасывает миллисекунды. Таким образом, полученный объект Date не имеет этой информации. Поэтому, когда вы его распечатываете, все нули.

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

Когда вы анализируете дату, она использует только предоставленную вами информацию. В этом случае он знает только MM-dd-yyyy HH: mm.

Создание нового объекта даты возвращает текущую системную дату / время (количество миллисекунд с начала эпохи).

toString () объекта Date не показывает миллисекунды ... Но они есть

Итак, new Date () - это объект с разрешением в миллисекунды, что можно увидеть по:

  System.out.printf( "ms = %d\n", myDate.getTime() % 1000 ) ;

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

Я упустил здесь вопрос?

[править] Ха-ха-ха ... слишком медленно;)

Date.getTime возвращает количество миллисекунд с 1 января 1970 г., 00:00:00 по Гринвичу, представленное объектом Date. Итак, «06-04-2007 07:05» - «01-01-1970 00:00» равно 1180955340000 миллисекундам. Поскольку единственная проблема вашего вопроса связана с временной частью даты, приблизительный способ мышления этого расчета - это количество миллисекунд между 07:05 и 00:00, что составляет 25500000. Это делится на 1000 без остатка, поскольку ни одно время имеет любые миллисекунды.

Во второй дате используется текущее время, когда выполняется эта строка кода. Это будет использовать любые текущие миллисекунды после текущей секунды в вычислении. Следовательно, Date.getTime, скорее всего, вернет число, которое не делится на 1000 без остатка.

Метод getTime() для Date возвращает количество миллисекунд с 1 января 1970 года (эта дата называется «эпохой», потому что все компьютерные даты основаны на этой дате). Следует использовать нет для отображения удобочитаемой версии вашей даты.

Вместо этого используйте метод SimpleDateFormat.format(). Вот исправленная версия части вашего кода, которая, я думаю, может решить вашу проблему:

String date = "06-04-2007 07:05:23:123";
SimpleDateFormat fmt = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss:S");
Date myDate = fmt.parse(date); 

System.out.println(myDate);  //Mon Jun 04 07:05:23 EDT 2007
String formattedDate = fmt.format(myDate);
System.out.println(formattedDate); //06-04-2007 07:05:23:123

Вместо использования библиотек Sun JDK Time / Date (которые оставляют желать лучшего) я рекомендую взглянуть на http://joda-time.sourceforge.net.

Это очень зрелый и активный проект sourceforge с очень элегантным API.

import java.util.*;

public class Time {
    public static void main(String[] args) {
        Long l = 0L;
        Calendar c = Calendar.getInstance();
        //milli sec part of current time
        l = c.getTimeInMillis() % 1000;  
        //current time without millisec
        StringBuffer sb = new StringBuffer(c.getTime().toString());
        //millisec in string
        String s = ":" + l.toString();
        //insert at right place
        sb.insert(19, s);
        //ENJOY
        System.out.println(sb);
    }
}

tl; dr

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

Используйте java.time.

LocalDateTime.parse
( 
    "06-04-2007 07:05" , 
    DateTimeFormatter.ofPattern( "MM-dd-uuuu HH:mm" ) 
)
.atZone
(
    ZoneId.of( "Africa/Casablanca" ) 
)
.toInstant()
.getEpochMilli()

java.time

Современный подход использует классы java.time, определенные в JSR 310, которые много лет назад вытеснили ужасные классы, которые вы используете.

Определите шаблон форматирования, соответствующий вашему вводу. К вашему сведению: научитесь использовать стандартные форматы ISO 8601 для обмена значениями даты и времени в виде текста.

String input = "06-04-2007 07:05" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM-dd-uuuu HH:mm" ) ;

Разберите свой ввод как LocalDateTime, так как в нем отсутствует индикатор часового пояса или смещения от UTC.

LocalDateTime ldt = LocalDateTime.parse( input , f ) ;

Он представляет дату и время дня, но не имеет контекста часового пояса или смещения. Поэтому мы не знаем, имели ли вы в виду 7 утра в Токио, Япония, 7 утра в Тулузе, Франция, или 7 утра в Толедо, штат Огайо, США. Эта проблема часового пояса имеет решающее значение, потому что желаемое количество миллисекунд - это счетчик с первого момента 1970 года, как видно в UTC (смещение нуля часов-минут-секунд), 1970-01-01T00: 00Z.

Поэтому мы должны поместить ваше входное значение, объект LocalDateTime, в контекст часового пояса или смещения.

Если ваш ввод был предназначен для представления даты и времени в формате UTC, используйте OffsetDateTime с ZoneOffset.UTC.

OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ;  // Do this if your date and time represent a moment as seen in UTC. 

Если ваш ввод был предназначен для представления даты и времени через настенные часы, используемые людьми из определенного региона, используйте ZonedDateTime.

ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;

Затем мы хотим запросить количество миллисекунд с эпохи первого момента 1970 года по всемирному координированному времени. Имея в руках объект OffsetDateTime или ZonedDateTime, извлеките Instant, вызвав toInstant.

Instant instant = odt.toInstant() ;

…или же…

Instant instant = zdt.toInstant() ;

Теперь посчитайте миллисекунды.

long millisecondsSinceEpoch = instant.toEpochMilli() ;

Кстати, я предлагаю вам не отслеживать время по миллисекундам. Вместо этого используйте текст в формате ISO 8601: его легко анализировать машиной, легко читать люди в разных культурах. Счетчик миллисекунд - ни то, ни другое.


Table of date-time types in Java, both modern and legacy


О java.time

Фреймворк java.time встроен в Java 8 и новее. Эти классы заменяют неудобные старые классы даты и времени наследие, такие как java.util.Date, Calendar, & SimpleDateFormat.

Чтобы узнать больше, см. Учебник Oracle. И поищите в Stack Overflow множество примеров и объяснений. Спецификация - JSR 310.

Проект Джода-Тайм, теперь в Режим технического обслуживания, советует перейти на классы java.time.

Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте Драйвер JDBC, совместимый с JDBC 4.2 или новее. Нет необходимости в строках, нет необходимости в классах java.sql.*. Hibernate 5 и JPA 2.2 поддерживают java.time.

Где взять классы java.time?

  • Java SE 8, Java SE 9, Java SE 10, Java SE 11 и более поздние версии - часть стандартного Java API с объединенной реализацией.
    • В Java 9 добавлены некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport.
  • Android
    • Более поздние версии Android связывают реализации классов java.time.
    • Для более ранних версий Android (<26) проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше). См. Как использовать ThreeTenABP….

Другие вопросы по теме