在Java中将日期转换为毫秒

在Java中将日期转换为毫秒,java,date,milliseconds,Java,Date,Milliseconds,我需要将日期转换为相应的毫秒格式。为此,我使用Java中

我需要将日期转换为相应的毫秒格式。为此,我使用Java中
类的
getTime()
方法。但是生成的百万分之一不是我的实际日期。比我的约会时间少了一天。例如

我有
2014年11月22日
。如果我将此日期转换为毫秒格式,则生成
1416594600000
。实际上,该值对应于2014年11月21日的
21


请帮助我获取与java中日期相对应的精确毫秒值。

1416594600000对应于2014-11-21T18:30:00Z。换句话说,UTC 2014年11月21日下午6:30。是一个很好的资源来检查类似的事情

现在,日期对象本身没有任何时区信息。它只是代表了一个时间点。听起来您的“2014年11月22日”值可能是当地时区(印度?)的午夜。如果您正在从许多不同的时区生成值,并且没有存储哪个时区与哪个值对应,那么实际上您已经丢失了一些信息

如果您试图只表示一个日期(而不是一个时间点),但必须将其存储为unix历元值之后的毫秒,那么将该日期的午夜存储为UTC可能是有意义的,尽管您还应该非常清楚这就是您要做的。如果可以,您应该以某种方式存储该值,使其更明显地显示为日期-例如在数据库中使用
date
字段。如果您确切地知道要建模的数据,并且在代码中的任何地方都非常清楚,那么日期和时间工作通常并不像我们担心的那样困难


使事情更清楚的一种方法是使用一个好的日期/时间API,它允许您表示比
java.util.date
java.util.Calendar
更多种类的数据。这很好,Java8有了新的
Java.time.*
API。我强烈建议您尽快使用其中一种。1416594600000对应于2014-11-21T18:30:00Z。换句话说,UTC 2014年11月21日下午6:30。是一个很好的资源来检查类似的事情

现在,日期对象本身没有任何时区信息。它只是代表了一个时间点。听起来您的“2014年11月22日”值可能是当地时区(印度?)的午夜。如果您正在从许多不同的时区生成值,并且没有存储哪个时区与哪个值对应,那么实际上您已经丢失了一些信息

如果您试图只表示一个日期(而不是一个时间点),但必须将其存储为unix历元值之后的毫秒,那么将该日期的午夜存储为UTC可能是有意义的,尽管您还应该非常清楚这就是您要做的。如果可以,您应该以某种方式存储该值,使其更明显地显示为日期-例如在数据库中使用
date
字段。如果您确切地知道要建模的数据,并且在代码中的任何地方都非常清楚,那么日期和时间工作通常并不像我们担心的那样困难

使事情更清楚的一种方法是使用一个好的日期/时间API,它允许您表示比
java.util.date
java.util.Calendar
更多种类的数据。这很好,Java8有了新的
Java.time.*
API。我强烈建议您尽快搬到其中一家。

tl;博士 细节 这是正确和明智的

下面是一些使用java.time类的示例代码

LocalDate
该类表示一个仅限日期的值,不包含一天中的时间和时区

时区对于确定日期至关重要。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,中午夜后几分钟是新的一天,而中仍然是“昨天”

您可以指定一个
LocalDate

LocalDate ld = LocalDate.of( 2014 , Month.NOVEMBER , 22 );
LocalDate ld = LocalDate.of ( 2014 , Month.NOVEMBER , 22 );
ZoneId z = ZoneId.of ( "Asia/Kolkata" );
ZonedDateTime zdt = ld.atStartOfDay ( z );
ld.toString():2014-11-22

ZoneDateTime
您需要从epoch开始的毫秒计数。我不建议使用历元计数来处理日期时间。但如果你坚持的话,我们走吧

以毫秒为单位的历元计数意味着我们需要一天中的日期和时间。我们有约会。我想你想要一天中的第一个时刻作为一天中的时间。不要假设这个时间是
00:00:00
。夏时制(DST)等异常可能意味着一天从其他时间开始,如
01:00:00
。让java.time通过从
LocalDate
生成
ZonedDateTime
对象来确定第一个时刻

LocalDate ld = LocalDate.of( 2014 , Month.NOVEMBER , 22 );
LocalDate ld = LocalDate.of ( 2014 , Month.NOVEMBER , 22 );
ZoneId z = ZoneId.of ( "Asia/Kolkata" );
ZonedDateTime zdt = ld.atStartOfDay ( z );
zdt.toString():2014-11-22T00:00+05:30[亚洲/加尔各答]

Instant
如果需要,您可以提取一个
即时
。该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)。开发人员应该将UTC视为唯一的真实时间,而不是在工作时考虑自己的狭隘时区

Instant instant = zdt.toInstant ();
instant.toString():2014-11-21T18:30:00Z

从那一刻起,我们就可以要求从epoch开始计算毫秒数。请注意,这涉及数据丢失,因为任何纳秒都将被截断为毫秒

long epochMillis = instant.toEpochMilli();
java.util.Date
我建议避免使用遗留的日期时间类。但如果你必须,你可以改变信仰。查看添加到旧类的新方法,如


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到java.time

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • 后来
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • 爪哇
      java.util.Date utilDate = java.util.Date.from( instant );