我想将 DEC 31ST 1969 7 PM 的秒数转换为以下 Java 代码中的日期 / 时间。
package sampProp;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.StringTokenizer;
import java.util.TimeZone;
public cl 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
是因为您的时区未正确设置在您的服务器上吗?
检查此问题和答案:java incorrect timezone
检查您的开发服务器和生产服务器上的 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 时区标识符的含义发生了变化。从历史上看,EST 引用了美国东部标准时间并对夏令时进行了调整。更改后,EST 引用了东部标准时间,而没有对夏令时进行调整。还引入了一个与原始 EST 标识符具有相同含义的新标识符 EST5EDT。因此,EST5EDT 引用了美国东部标准时间并对夏令时进行了调整
避免这些问题的最佳方法是使用像 America / New_York 这样的长时区标识符。
如果无法更改应用程序以使用长时区标识符,则可以设置系统属性 ibm.dst.compatibility 或 sun.timezone.ids.oldmapping 来更改 EST 或 MST 的解释。

tl;博士
使用java.time类
指定所需 / 预期的时区
Ex:
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
从 DEC 31ST 1969 7 PM EST 开始的操作秒数
首先,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
我注意到您在 EST 中的起始时间是 1970 年之前的几个小时,恰好是 1970 年的第一时刻。该时刻 1970-01-01T00:00:00Z 是常见的epoch reference,通常称为Unix Time。该时刻也是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
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧日期时间类,如日期时间类2、日期时间类3和日期时间类SimpleDateFormat
。
现在位于1的项目建议迁移到2类。
要了解更多信息,请参阅Oracle Tutorial。并搜索Stack Overflow以获得许多示例和解释。规格为1。
您可以交换java。time对象直接与数据库关联。使用符合JDBC 4.2或更高版本的JDBC driver。不需要字符串,不需要java.sql.*
类。
从何处获取java。时间课程?
0、1、2、3和更高版本-标准Java API的一部分,带有实现。
Java9添加了一些小功能和修复。
Java SE 6andJava SE 7大多数java。time功能被后移植到Java 6&;7英寸ThreeTen-Backport。
Androidjava的更高版本的Android包实现。时间类。
对于早期的Android(<;26),ThreeTenABP项目适应ThreeTen-Backport(如上所述)。请参见。
ThreeTen-Extra项目扩展了java。时间与额外的课程。这个项目是未来可能添加java.time的一个试验场。您可以在这里找到一些有用的类,例如Interval
、YearWeek
、YearQuarter
和more。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(55条)