Java:来自unix时间戳的日期

时间:2010-07-30 12:22:45

标签: java unix timestamp

我需要将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

应该怎么做?

10 个答案:

答案 0 :(得分:396)

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

java.util.Date time=new java.util.Date((long)timeStamp*1000);

如果您已经有毫秒,那么只需new java.util.Date((long)timeStamp);

来自documentation

  

分配Date对象和   初始化它来代表   指定的毫秒数   标准基准时间称为“   时代“,即1970年1月1日,   00:00:00 GMT。

答案 1 :(得分:48)

java.time

Java 8推出了一个用于处理日期和时间的新API:java.time package

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

Date date = Date.from( Instant.ofEpochSecond( timeStamp ) );

Instant代表Java 8中的时间戳。使用静态Date.from()方法,您可以将Instant转换为java.util.Date实例。

答案 2 :(得分:43)

这是正确的方法:

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

答案 3 :(得分: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));

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

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

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

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

答案 4 :(得分:21)

TL;博士

Instant.ofEpochSecond( 1_280_512_800L )
  

2010-07-30T18:00:00Z

java.time

Java 8及更高版本中内置的新java.time框架是Joda-Time的继承者。

这些新类包含来自纪元的handy factory method to convert a count of whole seconds。你得到一个Instant,在UTC时间轴上的一个时刻,分辨率高达纳秒。

Instant instant = Instant.ofEpochSecond( 1_280_512_800L );
  

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

code run live at IdeOne.com

Asia/KabulAsia/Tehran个时区?

您报告的时间值为22:30而不是此处显示的18:00。我怀疑您的PHP实用程序隐式应用默认时区来从UTC进行调整。我的值是UTC,由Z表示(Zulu的缩写,表示UTC)。您的计算机操作系统或PHP是否有可能设置为Asia/KabulAsia/Tehran个时区?我想你在输出中报告IRST显然意味着伊朗时间。目前2017年those are the only zones的运行时间比UTC早四个半小时。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTISTIRST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的( !)。

如果您希望通过特定地区的时区镜头观看您的时刻,请应用ZoneId获取ZonedDateTime。仍然是同一时刻,但被视为不同的wall-clock time

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-30T22:30 + 04:30 [亚/德黑兰]

从java.time转换为旧类

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

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

约达时间

更新:Joda-Time项目现在位于maintenance mode,团队建议迁移到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

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

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

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 5 :(得分:11)

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

答案 6 :(得分:7)

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

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

设置时区;又称UTC, 你可以简单地重写;

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

答案 7 :(得分:1)

对于Kotlin

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

}

答案 8 :(得分:0)

有时您需要进行调整。

不要长时间使用演员表!使用纳米调整。

例如,使用Oanda Java API进行交易,您可以将日期时间转换为UNIX格式。

例如:1592523410.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) );

答案 9 :(得分:-3)

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