Java:来自unix时间戳的日期

我需要将unix时间戳转换为日期对象 我尝试了这个:

java.util.Date time = new java.util.Date(timeStamp);

时间戳值为:1280512800

日期应该是“2010/07/30 - 22:30:00”(因为我通过PHP得到它),但我得到Thu Jan 15 23:11:56 IRST 1970

应该怎么做呢?

354143 次浏览

对于1280512800,乘以1000,因为java期望的是毫秒:

java.util.Date time=new java.util.Date((long)timeStamp*1000);
如果你已经有了毫秒,那么只要new java.util.Date((long)timeStamp); < /代码> < / p >

文档:

分配一个Date对象和 对象初始化它以表示 指定的毫秒数 标准基准时间称为“时” epoch”,即1970年1月1日, 就是格林尼治时间。< / p >

Date的构造函数期望timeStamp值以毫秒为单位。 将时间戳值与1000相乘,然后将其传递给构造函数

这是正确的方法:

Date date = new Date ();
date.setTime((long)unix_time*1000);

看起来日历是一种新的方式:

Calendar mydate = Calendar.getInstance();
mydate.setTimeInMillis(timestamp*1000);
out.println(mydate.get(Calendar.DAY_OF_MONTH)+"."+mydate.get(Calendar.MONTH)+"."+mydate.get(Calendar.YEAR));

最后一行只是一个如何使用它的例子,这一行将打印如“14.06.2012”。

如果您已经使用System.currentTimeMillis()保存时间戳,则不需要“*1000”部分。

如果你在一个字符串中有时间戳,你需要首先将它解析为long: long . parselong(时间戳)。

https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html < a href = " https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html " > < / >

如果在不同的机器上转换时间戳值,还应该检查该机器的时区。例如;

如果您使用EST或UTC时区运行,上述描述将产生不同的Date值。

设置时区;也就是UTC, 你可以简单地重写;

    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
java.util.Date time= new java.util.Date((Long.parseLong(timestamp)*1000));

java.time

Java 8引入了一个用于处理日期和时间的新API:

与java。在UTC, 1970-01-01 t0: 00z,您可以解析自1970年第一个时刻的epoch引用以来的整个秒数。结果是Instant

Instant instant = Instant.ofEpochSecond( timeStamp );

如果你需要一个java.util.Date来与尚未为java.time更新的旧代码互操作,转换。调用添加到旧类中的新转换方法。

Date date = Date.from( instant );

博士tl;

Instant.ofEpochSecond( 1_280_512_800L )

2010 - 07 - 30 - t18:00:00z

java.time

新的java。Java 8及以后版本中内置的时间框架是Joda-Time的继承者。

这些新类包括方便的工厂方法转换整个秒数 from epoch。你会得到一个Instant,一个UTC时间轴上的时刻,分辨率高达纳秒。

Instant instant = Instant.ofEpochSecond( 1_280_512_800L );

instant.toString (): 2010 - 07 - 30 - t18:00:00z

看到代码在IdeOne.com上运行

现代和传统Java日期-时间类型表

Asia/KabulAsia/Tehran时区?

您报告的时间值是22:30,而不是这里看到的18:00。我怀疑您的PHP实用程序隐式地应用了一个默认时区来调整UTC。我在这里的值是UTC,由Z (Zulu的缩写,表示UTC)表示。您的机器操作系统或PHP是否有可能设置为Asia/KabulAsia/Tehran时区?我想是这样的,因为你在输出中报告IRST,这显然意味着伊朗时间。目前在2017年这些是唯一的区域运行的夏季时间比UTC早四个半小时。

continent/region的格式指定正确的时区名称,例如America/MontrealAfrica/CasablancaPacific/Auckland。永远不要使用3-4个字母的缩写,如ESTISTIRST,因为它们是America/Montreal0真实时区,不是标准化的,甚至不是唯一的(!)。

如果你想要通过特定地区的时区的镜头来观察你的时刻,应用ZoneId来得到ZonedDateTime。仍然是同一时刻,但被视为不同的

ZoneId z = ZoneId.of( "Asia/Tehran" ) ;
ZonedDateTime zdt = instant.atZone( z );  // Same moment, same point on timeline, but seen as different wall-clock time.

2010 - 07 - 30 - t22:30 + 04:30[亚洲/德黑兰]

从java转换。遗留类的时间

你应该坚持使用新的java。时间类。但如果需要,您可以转换为旧的。

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

Joda-Time

更新:Joda-Time项目现在在维护模式中,团队建议迁移到java.time类。

供您参考,Joda-Time DateTime的构造函数类似:乘以一千生成long(不是int!)

DateTime dateTime = new DateTime( ( 1_280_512_800L * 1000_L ), DateTimeZone.forID( "Europe/Paris" ) );

最好避免臭名昭著的麻烦的java.util.Date和. calendar类。但如果你必须使用日期,你可以从Joda-Time转换。

java.util.Date date = dateTime.toDate();

关于java.time

< em > java.time < / em >框架内置于Java 8及更高版本中。这些类取代了麻烦的旧遗产日期-时间类,如java.util.DateCalendar, &SimpleDateFormat

现在在维护模式中的< em > Joda-Time < / em >项目建议迁移到java.time类。

要了解更多信息,请参见< < em >甲骨文教程/ em >。搜索Stack Overflow可以找到很多例子和解释。规格是JSR 310

你可以直接与你的数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC驱动程序。不需要字符串,不需要java.sql.*类。

从哪里获取java。时间类?

Date d = new Date(i * 1000 + TimeZone.getDefault().getRawOffset());

在芬兰湾的科特林

fun unixToDate(timeStamp: Long) : String? {
val time = java.util.Date(timeStamp as Long * 1000)
val sdf = SimpleDateFormat("yyyy-MM-dd")
return sdf.format(time)


}

有时候你需要调整。

不要用cast来长!使用nanoadjustment。

例如,使用Oanda Java API进行交易,您可以获得UNIX格式的datetime。

例如:159252341010.590566943

    System.out.println("instant with nano = " + Instant.ofEpochSecond(1592523410, 590566943));
System.out.println("instant = " + Instant.ofEpochSecond(1592523410));

你会得到:

instant with nano = 2020-06-18T23:36:50.590566943Z
instant = 2020-06-18T23:36:50Z

此外,使用:

 Date date = Date.from( Instant.ofEpochSecond(1592523410, 590566943) );