问题是在Java中将秒转换为日期/时间
我想在下面的java代码中将1969年12月31日晚上7点到日期/时间的秒数转换为日期/时间问题是在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
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类
- 指定所需/预期时区
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() ) ;