繁体   English   中英

在Java中将日期转换为毫秒

[英]Convert Date to Milliseconds in Java

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

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

请帮助我获取与java中的Date相对应的确切毫秒值。

1416594600000对应于2014-11-21T18:30:00Z。 换句话说,就是2014年11月21日下午6点30分(UTC) Epoch Converter是检查此类问题的绝佳资源。

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

如果您只想表示一个日期(而不是时间点),但必须将其存储为毫秒数(因为unix-epoch以来的值),则可以将该日期的午夜存储在UTC中 ,尽管您也应该非常清楚地知道那就是您在做什么。 如果可以的话,应该以某种方式存储该值,使其更明显地是一个日期-例如在数据库中使用DATE字段。 如果您确切地知道要建模的数据,并在代码中的每个地方都非常清楚, 那么日期和时间的工作通常并不像我们担心的那么难。

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

tl; dr

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

细节

乔恩·斯基特答案是正确和明智的。

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

LocalDate

LocalDate类表示没有日期和时区的仅日期值。

时区对于确定日期至关重要。 在任何给定时刻,日期都会在全球范围内变化。 例如, 法国巴黎午夜过后几分钟是新的一天,而在魁北克蒙特利尔仍然是“昨天”。

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

您希望从纪元开始算起毫秒。 建议使用从时代开始计数来处理日期时间。 但是,如果您坚持要求,那么我们开始吧。

毫秒计数意味着我们需要一个日期一个时间。 我们有个约会。 我假设您希望将当天的第一时间作为一天中的时间。 不要以为这个时间是00:00:00 诸如夏令时(DST)之类的异常可能意味着这一天从其他时间开始,例如01:00:00 让java.time通过从LocalDate生成ZonedDateTime对象来确定第一时刻。

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

如果需要,您可以提取一个Instant Instant类以UTC表示时间轴上的时刻,分辨率为纳秒 (最多十进制的九(9)位数字)。 开发人员应该将UTC视为“ 一个真实的时间” ,而不是在工作时考虑自己的狭区时区。

Instant instant = zdt.toInstant ();

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

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

long epochMillis = instant.toEpochMilli();

java.util.Date

我建议避免使用旧的日期时间类。 但是,如果必须 ,您可以进行转换。 查看添加到旧类java.util.Date新方法,例如java.util.Date

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

关于java.time

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

现在处于维护模式Joda-Time项目建议迁移到java.time。

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

在哪里获取java.time类?

  • Java SE 8SE 9及更高版本
    • 内置的
    • 标准Java API的一部分,具有捆绑的实现。
    • Java 9添加了一些次要功能和修复。
  • Java SE 6SE 7
    • java.time的许多功能在ThreeTen- Backport中都被反向移植到Java 6和7。
  • 安卓系统

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目为将来可能在java.time中添加内容提供了一个试验场。 您可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter ,和更多

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM