在Java中获得“ unixtime”


258

Date.getTime()返回自1970年1月1日以来的毫秒数。Unixtime为自1970年1月1日以来的秒数。我有:

Date now = new Date();      
Long longTime = new Long(now.getTime()/1000);
return longTime.intValue();

有没有更好的方法来在Java中获取unixtime?


27
由于将其转换为整数,因此您引入了2038年的问题(相当于Unix的Y2K)。那时Unix时代达到了20亿,并转为负数。解决方法是移至64位Unix。Java等效项是将其保留很长时间。
约翰M,2009年

1
是的,我知道。与之交互的代码预期unixtime为32位int。
加里·理查森

157
2038年即将到来。
Pacerier,2012年

currentTimeMillis是否有适当的名称或标准?我倾向于在我的文档中将其称为UNIX时间的毫秒版本。
汤姆

1
如果您想让软件在溢出中幸免,请使用long,而不要使用intint除非您使用不同的粒度(例如1秒= 4秒等),否则实际上没有理由使用时间戳。要么这样做,要么隐藏您的代码,以免后代看到您的能力如何。
bryc

Answers:


475

避免使用System.currentTimeMillis()创建Date对象。除以1000将使您进入Unix时代。

如注释中所述,对于unixTime变量的类型,通常希望使用基元长(小写l长)而不是盒装对象长(大写L Long)。

long unixTime = System.currentTimeMillis() / 1000L;

3
还可以考虑使用原始的long而不是自动装箱到Long,除非您希望将数字作为对象来处理(例如将其放入Collection中),
否则

9
Java 32位int匹配32位平台(以及2038年的问题)。64位平台使用更大的time_t数据类型。Java通过使用long作为System.currentTimeMillis()的返回值来回避该问题。如果您转换为int,则会重新引入2038年的问题。参见en.wikipedia.org/wiki/Year_2038_problem#Solutions
John M

1
我认为您在以下方面有误:在这样的数字文字中使用小写的“ L”和大写的字母之间没有区别。 docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.1
matt forsythe 2014年

5
大写的讨论(在上面已经阐明)是关于数据类型的。原始的“ long”与“ java.lang.Long”类实例。您在谈论长字面量的后缀字母,我同意可以是大写或小写。尽管小写的“ l”看起来很像数字“ 1”,因此使用大写字母“ L”更容易理解。
约翰M

1
单击指向文档的链接。返回值定义为自UTC时区的1970年1月1日以来的毫秒数。您想要时区吗?看一下java.util.Calendar。
约翰M,

273

Java 8添加了用于处理日期和时间的新API。使用Java 8,您可以使用

import java.time.Instant
...
long unixTimestamp = Instant.now().getEpochSecond();

Instant.now()返回表示当前系统时间的Instant。随着,getEpochSecond()您将获得的纪元秒(unix时间)Instant


4
之间有什么区别Instant.now().getEpochSecond()new Date().getTime()以及System.currentTimeMillis()
SohamC

2
一个区别是前者以秒为单位,而后两者以毫秒为单位。可能有也可能没有其他人。
super_aardvark '16

3
import java.time.Instant如果您在Scala
akauppi '16

4
还要查看此网站以获取详细说明...喜欢它.. currentTimeMillis
Subroto

1
请注意,您不能在较早的android API级别上使用此方法。
阿里·纳达莱扎德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.