首页 文章

Java:来自unix时间戳的日期

提问于
浏览
215

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

应该怎么做?

8 回答

  • 21

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

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

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

    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
        java.util.Date time= new java.util.Date((Long.parseLong(timestamp)*1000));
    
  • 43
    Date d = new Date(i * 1000 + TimeZone.getDefault().getRawOffset());
    
  • -3

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

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

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

    来自documentation

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

  • 11

    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 实例 .

  • 393

    这是正确的方法:

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

    看起来日历是新的方式:

    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

  • 25

    tl;博士

    Instant.ofEpochSecond( 1_280_512_800L )
    

    2010-07-30T18:00:00Z

    java.time

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

    这些新类包括来自epoch的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 .

    亚洲/喀布尔或亚洲/德黑兰时区?

    您报告的时间值为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 . 切勿使用3-4字母缩写,例如 ESTISTIRST ,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!) .

    如果您想通过特定地区时区的镜头观察您的时刻,请应用 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

    更新: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类 . 但是如果你必须使用Date,你可以从Joda-Time转换 .

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

    关于java.time

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

    现在位于maintenance modeJoda-Time项目建议迁移到java.time类 .

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

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

    从哪里获取java.time类?

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

  • 47

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

相关问题