[英]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.Date
和java.util.Calendar
更多的数据。 Joda Time对此很有用,Java 8具有新的java.time.*
API。 我强烈建议您尽快移至其中之一。
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 8及更高版本中。 这些类取代了麻烦的旧式旧式日期时间类,例如java.util.Date
, .Calendar
和java.text.SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time。
要了解更多信息,请参见Oracle教程 。 并在Stack Overflow中搜索许多示例和说明。 规格为JSR 310 。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目为将来可能在java.time中添加内容提供了一个试验场。 您可以在这里找到一些有用的类,比如Interval
, YearWeek
, YearQuarter
,和更多 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.