在Java中将Date转换为Milliseconds

时间:2014-07-18 05:01:56

标签: java date milliseconds

我需要将Date转换为相应的毫秒格式。我在Java中使用 getTime() 类的Date方法。但产生的毫不是我的实际日期。这比我的约会少了一天。例如,

我有22-Nov-2014。如果我将此日期转换为毫秒格式,则会生成1,416,594,600,000。实际上这个值对应21-Nov-2014

请帮助我获得精确的毫秒值,对应于java中的Date

2 个答案:

答案 0 :(得分:10)

1416594600000对应于2014-11-21T18:30:00Z。换句话说,2014年11月21日下午6:30 UTC Epoch Converter是检查这类内容的绝佳资源。

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

如果您尝试只是表示日期(而不是某个时间点),但您必须将其存储为毫秒级自unix-epoch值,它可能会使感觉存储那个日期的午夜在UTC ,虽然你也应该清楚地说明这就是你正在做的事情。如果可以,您应该以某种方式存储该值,使其更明显,这是一个日期 - 例如在数据库中使用DATE字段。日期和时间工作通常并不像我们担心的那样困难如果你确切地知道你正在建模什么数据,并且在你的代码中的每个地方都非常清楚。

使事情更清晰的一种方法是使用一个好的日期/时间API,它允许您表示比java.util.Datejava.util.Calendar更多种类的数据。 Joda Time对此很有用,Java 8有新的java.time.* API。我强烈建议你尽快转到其中一个。

答案 1 :(得分:2)

TL;博士

LocalDate.of( 2014 , Month.NOVEMBER , 22 )
         .atStartOfDay( ZoneId.of ( "Asia/Kolkata" ) )
         .toInstant()
         .toEpochMilli()

详细

Answer by Jon Skeet是正确而明智的。

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

LocalDate

LocalDate类表示没有时间且没有时区的仅限日期的值。

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

您可以指定LocalDate

LocalDate ld = LocalDate.of( 2014 , Month.NOVEMBER , 22 );
  

ld.toString():2014-11-22

ZonedDateTime

你需要一个毫秒级的计数器。我建议使用count-from-epoch来处理日期时间。但如果你坚持,我们就去吧。

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

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

如果需要,您可以提取InstantInstant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。开发人员应将UTC视为 One True Time ,而在工作时考虑自己的狭隘时区。

Instant instant = zdt.toInstant ();
  

instant.toString():2014-11-21T18:30:00Z

从我们可以询问自纪元以来的毫秒数。请注意,这涉及数据丢失,因为任何纳秒将被截断为毫秒。

long epochMillis = instant.toEpochMilli();

java.util.Date

我建议避免遗留日期时间类。但如果你必须,你可以转换。查看添加到旧类的新方法,如java.util.Date

java.util.Date utilDate = java.util.Date.from( instant );

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date.Calendar和& java.text.SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore