我希望将以下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
答案 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)
例如:
Duration.between(
Instant.EPOCH ,
Instant.now()
)
与最早的Java版本捆绑在一起的可怕的旧日期时间类在多年前被 java.time 类所取代。
要使用特定区域(时区)的人们所使用的挂钟时间,请使用ZonedDateTime
。在UTC中,请使用Instant
。
以Continent/Region
的格式指定proper time zone name,例如Europe/Paris
,Africa/Casablanca
或Pacific/Auckland
。切勿使用2-4个字母的缩写,例如EST
或IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
目前位于Joda-Time的maintenance 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中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。