在Java中将日期转换为毫秒
我需要将日期转换为相应的毫秒格式。为此,我使用Java中在Java中将日期转换为毫秒,java,date,milliseconds,Java,Date,Milliseconds,我需要将日期转换为相应的毫秒格式。为此,我使用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 );