我知道如何获得1.1.1970之后的日期的毫秒数。但是,我怎样才能获得之前之前发生的特定日期的毫秒数? 我需要在Android应用程序中。 谢谢!
答案 0 :(得分:2)
所有数字都是用java签名的,所以所有数字都可以是负数。因此,您可以使用负数毫秒的日期。时间戳小于0的日期肯定是可能的。
您可以通过以下方式了解最早的日期:
new Date(Long.MIN_VALUE)
您会发现这会返回超过2.92亿年前的日期。这甚至是在侏罗纪时代之前。因此,真的不需要担心1970年之前的日期:)
答案 1 :(得分:1)
使用java.time.Instant,在Instant中获取日期,您可以使用getEpochSecond()方法返回Epoch之前的秒数,然后从中转换。
https://docs.oracle.com/javase/8/docs/api/java/time/Instant.html了解有关Instant课程的更多详情。
答案 2 :(得分:1)
LocalDate.of( 1953 , 1 , 17 )
.atStartOfDay( ZoneId.of( "America/Montreal" ) )
.toInstant()
.toEpochMilli()
......产生一个负数:
-535057200000
正如其他答案所说:
(a)在将时刻表示为来自epoch-reference-date的时刻,在纪元之前的时刻使用负数,在纪元之后的时刻使用正数。
(b)您应该使用java.time类,而不是现在遗留下来的麻烦的旧日期时间类。有关Android后端口的信息,请参阅下文。
使用LocalDate
获取仅限日期的值,不包含时间或时区。
LocalDate ld = LocalDate.of( 1953 , 1 , 17 );
要转换为片刻,让我们在该日期获得当天的第一个时刻。这意味着指定一个时区,因为日期在全球范围内按时区变化。应用ZoneId
获取ZonedDateTime
对象。
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ld.atStartOfDay( z );
在UTC时间轴上提取一个Instant
。
Instant instant = zdt.toInstant();
从Instant
开始,以UTC(1970-01-01T00:00:00Z
)的形式提取1970年第一时刻以来的毫秒数。注意数据丢失,因为java.time类可以保持分辨率高达nanoseconds的时刻;要求milliseconds意味着如果存在则减少任何纳秒。
long epochMillis = instant.toEpochMilli();
请参阅此code run line in IdeOne.com。
ld.toString():1953-01-17
zdt.toString():1953-01-17T00:00-05:00 [美国/蒙特利尔]
instant.toString():1953-01-17T05:00:00Z
epochMillis:-535057200000
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
答案 3 :(得分:0)
这个问题是我无法重现的。在1970年1月1日之前,这些值是负数。现在,我的程序计算正确,但我认为,我没有改变代码中的内容。也许这是一个缓存版本,导致了问题。谢谢你的所有答案!