问题是在Java中将秒转换为日期/时间

时间:2013-11-04 17:30:52

标签: java aix

我希望将以下Java代码中的DEC 31ST 1969 7 PM的秒数转换为日期/时间。

package sampProp;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.StringTokenizer;
import java.util.TimeZone;


public class sample 
{    
    public static void main(String args[])  
    {

     //Here 1373605580 is the number os secs from DEC 31ST 1969 7 PM
     long millisecs = (long)(1373605580) *1000;

     DateFormat df = new SimpleDateFormat("MM/dd/yyyy_HH:mm:ss a");

     df.setTimeZone(TimeZone.getTimeZone("EST"));

     Date d1 = new Date(millisecs);

     String formattedDate = df.format(d1); 

     System.out.println("Formatted date is "+formattedDate);

    } 
}

我在AIX服务器上运行代码。

我的开发服务器提供的值07/12/2013_00:06:20是正确的,但我的生产服务器提供的07/12/2013_01:06:20不正确。

这怎么可能。我该如何纠正这个问题。

我的开发服务器的java版本输出是:

java version "1.5.0"
Java(TM) 2 Runtime Environment, Standard Edition (build pap64dev-20071008 (SR6))
IBM J9 VM (build 2.3, J2RE 1.5.0 IBM J9 2.3 AIX ppc64-64 j9vmap6423-20071007 (JIT enabled)
J9VM - 20071004_14218_BHdSMr
JIT  - 20070820_1846ifx1_r8
GC   - 200708_10)
JCL  - 20071008

我的生产服务器的java版本输出是:

java version "1.5.0"
Java(TM) 2 Runtime Environment, Standard Edition (build pap64dev-20080315 (SR7))
IBM J9 VM (build 2.3, J2RE 1.5.0 IBM J9 2.3 AIX ppc64-64 j9vmap6423-20080315 (JIT enabled)
J9VM - 20080314_17962_BHdSMr
JIT  - 20080130_0718ifx2_r8
GC   - 200802_08)
JCL  - 20080314

2 个答案:

答案 0 :(得分:1)

是否因为您的服务器上的时区设置不正确?

检查此问题并回答:java incorrect timezone

在开发服务器和生产服务器上检查JVM的时区。

修改

正如许多人所说的那样:它不应该来自于它,它仍然很奇怪,你的两个服务器之间的配置看起来非常相似(仍然是:JVM不一样)。应该有区别,所以检查JVM args和系统变量,看看时区对我来说似乎是第一次。

RE-编辑:

正如大卫所说:这是一个关于节省时间的错误:

以下是链接:http://www.coderanch.com/t/458357/java/java/AIX-Timezone-Java-showing-hour

来自IBM的链接:http://www-01.ibm.com/support/docview.wss?uid=swg21250503

我引用:

  

2006年,EST时区标识符的含义发生了变化   奥尔森数据库。从历史上看,EST指的是美国东部   标准时间并对夏令时进行调整。以下   更改,EST指东部标准时间,无需调整   夏令时。还引入了新的标识符EST5EDT   与原始EST标识符具有相同含义。 EST5EDT   因此,指美国东部标准时间和制造   调整夏令时。

     

避免这些问题的最佳方法是使用长时区   像America / New_York这样的标识符。

     

如果您无法更改应用程序以使用长时区   标识符,您可以设置系统属性ibm.dst.compatibility或   sun.timezone.ids.oldmapping改变EST或MST的解释。

答案 1 :(得分:0)

tl; dr

  • 使用 java.time
  • 指定所需/预期的时区

例如:

Duration.between( 
    Instant.EPOCH , 
    Instant.now() 
)

避免使用旧的日期时间类

与最早的Java版本捆绑在一起的可怕的旧日期时间类在多年前被 java.time 类所取代。

要使用特定区域(时区)的人们所使用的挂钟时间,请使用ZonedDateTime。在UTC中,请使用Instant

使用正确的时区名称

Continent/Region的格式指定proper time zone name,例如Europe/ParisAfrica/CasablancaPacific/Auckland。切勿使用2-4个字母的缩写,例如ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Montreal" ) ;  

ZoneId

  

从1969年12月31日美国东部标准时间下午7点开始的数字操作系统秒数

首先,如上所述,EST不是时区。我假设您是指北美东部海岸的时区,例如America/New_York

ZoneId z = ZoneId.of( "America/New_York" ) ;  

ZonedDateTime

在一个时区中,我们需要ZonedDateTime

ZonedDateTime zdt = ZonedDateTime.of( 1969 , 12 , 31 , 17 , 0 , 0 , 0 , z ) ;
  

zdt.toString():1969-12-31T17:00-05:00 [美国/纽约]

Duration

要将时间跨度表示为秒数,请使用Duration类。

ZonedDateTime now = ZonedDateTime.now( z ) ;
Duration d = Duration.between( zdt , now ) ;
  

now.toString():2018-12-26T19:32:08.136846-05:00 [美国/纽约]

     

d.toString():PT429410H32M8.136846S

以秒为单位询问整个时间范围。

long wholeSeconds = d.getSeconds();
  

整个秒:1545877928

Instant

我注意到您的起源时间大约是在1970年EST的1970年美国东部时间(UTC)的1970年之前的几个小时。那一刻1970-01-01T00:00:00Z是常见的epoch reference,通常称为Unix Time。那一刻也是 java.time 类使用的时代参考。

我怀疑您是使用自己的个人时区的观点陷入了狭och思想的陷阱。当程序员时,这是不明智的。当程序员在工作时,您应该几乎一直都在考虑UTC,在UTC中存储,在UTC中登录以及在UTC中交换数据。仅在业务逻辑要求时或用户在用户界面中期望时才应用时区。

要使用UTC跟踪时刻,请使用Instant。对于1970-01-01T00:00:00Z的纪元参考,请使用常量Instant.EPOCH

Duration d = Duration.between( Instant.EPOCH , Instant.now() ) ;

关于 java.time

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

目前位于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