我想在下面的java代码中转换从DEC 31 1969年下午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服务器上运行代码。
我的开发服务器给出了值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发布于 2013-11-04 17:44:32
是因为您的时区在您的服务器上没有正确设置吗?
检查以下问题和答案:java不正确时区
检查开发服务器和生产服务器中JVM的时区。
编辑
正如许多人说的:它不应该来自于此,但它仍然很奇怪,而且您的配置在您的两个服务器之间似乎非常相似(仍然: JVM是不一样的)。应该有区别,所以检查JVM args和系统变量,看看时区对我来说似乎是第一步。
重新编辑:
正如大卫所提到的:这是一个关于节省时间的错误:
下面是链接: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时区标识符的含义发生了变化。从历史上看,东部标准时间指的是美国东部标准时间,并对夏令时进行了调整。随着时间的变化,东部标准时间指的是东部标准时间,没有夏令时的调整。还引入了一个新的标识符EST5EDT,该标识符的含义与原始EST标识符相同。因此,EST5EDT指的是美国东部标准时间,并对夏令时进行调整。 避免这些问题的最好方法是使用像美国/纽约这样的长时区标识符。 如果不能更改应用程序以使用长时区标识符,则可以设置系统属性ibm.dst.compatibility或sun.timezone.ids.oldmapping以更改对EST或MST的解释。
发布于 2018-12-27 00:41:19
tl;dr
例如:
Duration.between(
Instant.EPOCH ,
Instant.now()
)避免遗留日期-时间类
与最早版本的Java捆绑在一起的可怕的旧日期时间类几年前被java.time类所取代。
对于某个特定地区(时区)的人使用的挂钟时间,请使用ZonedDateTime。在UTC的某个时刻,使用Instant。
使用适当的时区名称
以Continent/Region格式指定Continent/Region,如Europe/Paris、Africa/Casablanca或Pacific/Auckland。不要使用2-4字母的缩写,如EST或IST,因为它们不是真正的时区,不标准化,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" ) ; ZoneId
编号os从DEC 31 1969年7月美国东部时间下午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 ) ;2018-12-26T19:32:08.136846-05:00America/New_York :now.toString() d.toString():PT429410H32M8.136846S
从整秒的角度来要求整个时间跨度。
long wholeSeconds = d.getSeconds();wholeSeconds: 1545877928
Instant
我注意到你的起源时间是1970年前几个小时,在美国东部时间恰巧是在世界协调时,1970年的第一个时刻。那一刻,1970-01-01T00:00:00Z是一个常见的时代基准,俗称Unix时间。这一时刻也是java.time类使用的划时代的引用。
我怀疑你从个人时区的角度来看,陷入了狭隘思维的陷阱。这是不明智的,当程序员。当程序员在工作时,您应该在UTC中思考,在UTC中存储,在UTC中登录,几乎一直在UTC中交换数据。仅在业务逻辑要求或用户在用户界面中需要时应用时区。
要跟踪UTC的某个时刻,请使用Instant。对于1970-01-01T00:00:00Z的时代参考,使用常量Instant.EPOCH。
Duration d = Duration.between( Instant.EPOCH , Instant.now() ) ;关于java.time
http://docs.oracle.com/javase/10/docs/api/java/time/package-summary.html框架内置到Java8和更高版本中。这些类取代了麻烦的旧遗赠日期时间类,如java.util.Date、Calendar和SimpleDateFormat。
http://www.joda.org/joda-time/项目现在在维护模式中,建议迁移到java.time类。
要了解更多信息,请参见http://docs.oracle.com/javase/tutorial/datetime/TOC.html。并搜索堆栈溢出以获得许多示例和解释。规范是JSR 310。
您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC 4.2。不需要字符串,也不需要java.sql.*类。
在哪里获得java.time类?
三次-额外项目使用其他类扩展java.time。这个项目是将来可能加入java.time的试验场。您可以在这里找到一些有用的类,如Interval、YearWeek、YearQuarter和更多。
https://stackoverflow.com/questions/19773527
复制相似问题