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

问题是在Java中将秒转换为日期/时间,java,aix,Java,Aix,我想在下面的java代码中将1969年12月31日晚上7点到日期/时间的秒数转换为日期/时间 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 { pub

我想在下面的java代码中将1969年12月31日晚上7点到日期/时间的秒数转换为日期/时间

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服务器上运行代码

我的开发服务器给出的值是正确的,但我的生产服务器给出的值是不正确的

这怎么可能。我怎样才能纠正这个问题

我的开发服务器的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

是因为您的服务器没有正确设置时区吗

检查以下问题和答案:

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

编辑

正如许多人所说:它不应该来自于此,但是它很奇怪,而且您的配置在两台服务器之间看起来非常相似(仍然:JVM不一样)。应该有区别,所以检查JVM参数和系统变量,查看时区似乎是我的第一步

重新编辑:

正如David提到的:这是一个关于节省时间的错误:

以下是链接:

以及来自IBM的链接:

我引述:

2006年,美国东部时间时区标识符的含义发生了变化 奥尔森数据库。历史上,EST指的是美国东部地区 标准时间,并对夏令时进行了调整。下列的 变化,EST指东部标准时间,不调整 夏时制。还引入了一个新的标识符EST5EDT 与原始EST标识符具有相同的含义。EST5EDT 因此参考美国东部标准时间并做出 夏令时的调整

避免这些问题的最佳方法是使用长时区 比如美国/纽约

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


是因为您的服务器没有正确设置时区吗

检查以下问题和答案:

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

编辑

正如许多人所说:它不应该来自于此,但是它很奇怪,而且您的配置在两台服务器之间看起来非常相似(仍然:JVM不一样)。应该有区别,所以检查JVM参数和系统变量,查看时区似乎是我的第一步

重新编辑:

正如David提到的:这是一个关于节省时间的错误:

以下是链接:

以及来自IBM的链接:

我引述:

2006年,美国东部时间时区标识符的含义发生了变化 奥尔森数据库。历史上,EST指的是美国东部地区 标准时间,并对夏令时进行了调整。下列的 变化,EST指东部标准时间,不调整 夏时制。还引入了一个新的标识符EST5EDT 与原始EST标识符具有相同的含义。EST5EDT 因此参考美国东部标准时间并做出 夏令时的调整

避免这些问题的最佳方法是使用长时区 比如美国/纽约

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

tl;博士
  • 使用java.time类
  • 指定所需/预期时区
例:

避免遗留日期时间类 与最早版本的Java捆绑在一起的可怕的旧日期时间类在几年前被Java.time类取代

对于特定地区(时区)的人们使用的挂钟时间,请使用
ZonedDateTime
。在UTC中使用
Instant
片刻

使用正确的时区名称 以
大陆/地区
的格式指定,例如
欧洲/巴黎
非洲/卡萨布兰卡
,或
太平洋/奥克兰
。切勿使用2-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

ZoneId
从1969年12月31日起的操作系统秒数美国东部时间下午7点

首先,如上所述,
EST
不是时区。我想你指的是北美东海岸的时区,比如
美国/纽约

ZoneId z = ZoneId.of( "America/New_York" ) ;  
ZoneDateTime
在时区中的某一时刻,我们需要
ZonedDateTime

ZonedDateTime zdt = ZonedDateTime.of( 1969 , 12 , 31 , 17 , 0 , 0 , 0 , z ) ;
zdt.toString():1969-12-31T17:00-05:00[美国/纽约]

持续时间
要将时间跨度表示为秒数,请使用
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恰好是UTC,1970年的第一个时刻。那一刻,1970-01-01T00:00:00Z,是一个常见的,通常被称为。该时刻也是java.time类使用的历元引用

我怀疑你掉进了狭隘思维的陷阱,用你自己的个人时区的观点。这是不明智的当程序员。当程序员在工作时,几乎所有的时间都应该用UTC思考,用UTC存储,用UTC登录,用UTC交换数据。仅当业务逻辑需要时或用户在用户界面中预期时应用时区

要跟踪UTC时间内的某个时刻,请使用
Instant
。对于1970-01-01T00:00:00Z的历元参考,使用常数
Instant.epoch

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

阿布
long wholeSeconds = d.getSeconds();
Duration d = Duration.between( Instant.EPOCH , Instant.now() ) ;