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

我想将 DEC 31ST 1969 7 PM 的秒数转换为以下 Java 代码中的日期 / 时间。

我想将 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
1

是因为您的时区未正确设置在您的服务器上吗?

检查此问题和答案: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 的解释。

0

tl;博士

使用java.time

指定所需 / 预期的时区

Ex:

Duration.between( 
    Instant.EPOCH , 
    Instant.now() 
)

避免旧式日期时间类

与最早版本的 Java 在一起的可怕的旧日期时间类在几年前被java.time类所取代。

对于通过特定区域(时区)的人使用的挂钟时间看到的时刻,请使用ZonedDateTime。对于 UTC 中的某个时刻,请使用Instant

使用正确的时区名称

Continent/Region的格式指定proper time zone name,如Europe/ParisAfrica/CasablancaPacific/Auckland。切勿使用 2-4 个字母的缩写,如ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一

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

Android

java的更高版本的Android包实现。时间类。

对于早期的Android(<26),ThreeTenABP项目适应ThreeTen-Backport(如上所述)。请参见。

ThreeTen-Extra项目扩展了java。时间与额外的课程。这个项目是未来可能添加java.time的一个试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(113)
如何在 Google电子表格中添加印度卢比货币符号
上一篇
VisualStudioALT代码符号
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(55条)