Date.getTime()不包括时间?

时间:2008-09-16 17:08:17

标签: java date timestamp 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?

10 个答案:

答案 0 :(得分:20)

几毫秒?您在第一个示例中仅提供了分钟信息,而您的第二个示例以毫秒为单位从系统中获取当前日期,您正在寻找什么?

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

答案 1 :(得分:2)

同意上述内容,不应该有任何毫秒。 。

答案 2 :(得分:2)

因为您指定的简单日期格式会丢弃毫秒。因此生成的Date对象没有该信息。所以当你把它打印出来时,全是0。

另一方面,Date对象在为其分配一个毫秒的值(在这种情况下,使用new Date())时会保留毫秒数。因此,当您打印出来时,它也包含毫秒数。

答案 3 :(得分:2)

我建议您不要使用Sun JDK时间/日期库(这有很多不足之处),我建议您查看http://joda-time.sourceforge.net

这是一个非常成熟且活跃的sourceforge项目,并且具有非常优雅的API。

答案 4 :(得分:1)

tl; dr

接受的Answer by Vinko Vrsalovic是正确的。您输入的是整分钟,因此小数秒的毫秒数确实应该为零。

使用 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

现代方法使用了几年前在JSR 310中定义的 java.time 类,该类取代了您正在使用的可怕类。

定义格式设置模式以匹配您的输入。仅供参考:学会使用标准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年1月1日以来的计数(以UTC(零时分-秒-秒)表示)1970-01-01T00:00Z。

因此,我们必须将您的输入值LocalDateTime对象放在时区或偏移量的上下文中。

如果您的输入旨在表示以UTC表示的日期和时间,请将OffsetDateTimeZoneOffset.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 ) ;

接下来,我们要询问自UTC 1970年第一时刻以来的毫秒数。手持OffsetDateTimeZonedDateTime对象,通过调用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及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参阅Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规范为JSR 310

Joda-Time项目(现在位于maintenance mode中)建议迁移到java.time类。

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。 Hibernate 5和JPA 2.2支持 java.time

在哪里获取java.time类?

答案 5 :(得分:0)

解析日期时,它仅使用您提供的信息。 在这种情况下,它只知道MM-dd-yyyy HH:mm。

创建新的日期对象将返回当前系统日期/时间(自纪元以来的毫秒数)。

答案 6 :(得分:0)

Date对象的

toString()没有显示毫秒......但是它们在那里

所以新的Date()是一个具有毫秒分辨率的对象,如下所示:

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

但是,使用SimpleDateFormat构造日期时,不会向其传递毫秒数

我在这里错过了这个问题吗?

[编辑]哈哈哈......太慢了;)

答案 7 :(得分:0)

Date.getTime返回自Date对象表示的1970年1月1日00:00:00 GMT以来的毫秒数。所以“06-04-2007 07:05” - “01-01-1970 00:00”等于1180955340000毫秒。由于您的问题唯一关注的是日期的时间部分,因此粗略思考此计算的方法是07:05和00:00之间的毫秒数,即25500000.由于两次都没有,因此可以被1000整除有任何毫秒。

在第二个日期,它使用执行该行代码时的当前时间。这将使用当前秒的当前毫秒数在计算中。因此,Date.getTime很可能会返回一个不能被1000整除的数字。

答案 8 :(得分:0)

getTime() Date方法返回自1970年1月1日以来的毫秒数(此日期称为“纪元”,因为所有计算机日期均基于此日期)。 应该用于显示您日期的人类可读版本。

请改用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

答案 9 :(得分:0)

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);
    }
}
相关问题