Вопрос

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

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?
Это было полезно?

Решение

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

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);

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

согласен с вышеизложенным, миллисекунд быть не должно...

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

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

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

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

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

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

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
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);
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top