Java:来自unix时间戳的日期

RYN*_*RYN 234 java unix timestamp

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

java.util.Date time = new java.util.Date(timeStamp);
Run Code Online (Sandbox Code Playgroud)

时间戳值是: 1280512800

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

应该怎么做?

Pab*_*ruz 421

因为1280512800,乘以1000,因为java需要毫秒:

java.util.Date time=new java.util.Date((long)timeStamp*1000);
Run Code Online (Sandbox Code Playgroud)

如果你已经有毫秒,那么就是 new java.util.Date((long)timeStamp);

文档:

分配Date对象并将其初始化以表示自标准基准时间(称为"epoch")以来的指定毫秒数,即1970年1月1日00:00:00 GMT.

  • 转换为`(long)`非常重要:没有它,整数溢出. (39认同)
  • 不需要长时间施放.time = new java.util.Date(timeStamp*1000L)的工作原理也一样好(因为1000L是一个很长的,时间戳会在乘法之前很久才会被上传) (5认同)
  • @TomasK`java.util.Date`是该类的完全限定名.如果您在类上导入`java.util`包,那么`Date`可能是完全相同的**. (2认同)
  • 我个人会这样做:`日期时间=新日期(TimeUnit.MILLISECONDS.convert(unixTimestamp,TimeUnit.SECONDS));` (2认同)
  • 仅供参考,麻烦的旧日期时间类如[`java.util.Date`](https://docs.oracle.com/javase/8/docs/api/java/util/Date.html)现在[遗产](https://en.wikipedia.org/wiki/Legacy_system),由[java.time]取代(https://docs.oracle.com/javase/8/docs/api/java/time/package -summary.html)类.请参阅[Oracle教程](https://docs.oracle.com/javase/tutorial/datetime/TOC.html). (2认同)

mic*_*cha 53

java.time

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

使用java.time,您可以使用:

Instant instant = Instant.ofEpochSecond( timeStamp ;
Run Code Online (Sandbox Code Playgroud)

一个即时代表的Java 8中的时间戳和静态Instant您可以将转换方法java.util.DateInstant实例.

  • 虽然这个答案在技术上是正确的,但请注意[java.time](https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html)类取代了麻烦的旧日期-time类,例如`java.util.Date`.旧类是遗留的,应该避免.虽然您确实可以转换为legacy和java.time类,但最好尽可能坚持使用java.time. (3认同)

Mar*_*sia 44

这是正确的方法:

Date date = new Date ();
date.setTime((long)unix_time*1000);
Run Code Online (Sandbox Code Playgroud)


小智 25

看起来日历是新的方式:

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

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

如果您使用System.currentTimeMillis()来保存时间戳,则不需要"*1000"部分.

如果您在字符串中有时间戳,则需要先将其解析为long:Long.parseLong(timestamp).

https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html

  • 警告:如果`timestamp`是一个整数,你需要首先将它强制转换为`(long)`,否则你最终会得错错日期.`mydate.setTimeInMillis((long)timestamp*1000);` (8认同)

Bas*_*que 24

TL;博士

Instant.ofEpochSecond( 1_280_512_800L )
Run Code Online (Sandbox Code Playgroud)

2010-07-30T18:00:00Z

java.time

内置于Java 8及更高版本的新java.time框架是Joda-Time的后续版本.

这些新类包括一个方便的工厂方法,用于转换纪元的整秒计数.你Instant在UTC的时间线上得到一个片刻,分辨率高达纳秒.

Instant instant = Instant.ofEpochSecond( 1_280_512_800L );
Run Code Online (Sandbox Code Playgroud)

instant.toString():2010-07-30T18:00:00Z

请参阅IdeOne.com上的代码.

Asia/Kabul还是Asia/Tehran时区?

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

指定适当的时区名称,格式continent/region,如America/Montreal,Africa/CasablancaPacific/Auckland.切勿使用3-4个字母的缩写,如ESTISTIRST因为他们没有真正的时区,不规范,甚至不是唯一的(!).

如果你通过特定地区时区的镜头看到你的时刻,请用a 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.
Run Code Online (Sandbox Code Playgroud)

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

从java.time转换为旧类

你应该坚持使用新的java.time类.但如果需要,您可以转换为旧版本.

java.util.Date date = java.util.Date.from( instant );
Run Code Online (Sandbox Code Playgroud)

乔达时间

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

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

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

最好避免使用臭名昭着的java.util.Date和.Calendar类.但是如果你必须使用Date,你可以从Joda-Time转换.

java.util.Date date = dateTime.toDate();
Run Code Online (Sandbox Code Playgroud)

关于java.time

java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.

现在处于维护模式Joda-Time项目建议迁移到java.time类.

要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.

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

从哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval,YearWeek,YearQuarter,和更多.


f1s*_*1sh 11

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


小智 7

如果要在其他计算机上转换时间戳值,还应检查该计算机的时区.例如;

如果您使用EST或UTC时区运行,上述说明将导致不同的日期值.

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

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

  • 我不推荐这个,因为这设置了整个jvm的时区而不仅仅是解析过程! (5认同)