首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >问题是在Java中转换秒到日期/时间

问题是在Java中转换秒到日期/时间
EN

Stack Overflow用户
提问于 2013-11-04 17:30:51
回答 2查看 691关注 0票数 1

我想在下面的java代码中转换从DEC 31 1969年下午7点到日期/时间的秒数。

代码语言:javascript
复制
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版本输出是:

代码语言:javascript
复制
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版本输出是:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 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的解释。

票数 1
EN

Stack Overflow用户

发布于 2018-12-27 00:41:19

tl;dr

  • 使用java.time类
  • 指定所需/预期的时区

例如:

代码语言:javascript
复制
Duration.between( 
    Instant.EPOCH , 
    Instant.now() 
)

避免遗留日期-时间类

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

对于某个特定地区(时区)的人使用的挂钟时间,请使用ZonedDateTime。在UTC的某个时刻,使用Instant

使用适当的时区名称

Continent/Region格式指定Continent/Region,如Europe/ParisAfrica/CasablancaPacific/Auckland。不要使用2-4字母的缩写,如ESTIST,因为它们不是真正的时区,不标准化,甚至不是唯一的(!)。

代码语言:javascript
复制
ZoneId z = ZoneId.of( "America/Montreal" ) ;  

ZoneId

编号os从DEC 31 1969年7月美国东部时间下午7

首先,正如上面所讨论的,EST不是一个时区。我想你指的是来自北美东海岸的时区,比如America/New_York

代码语言:javascript
复制
ZoneId z = ZoneId.of( "America/New_York" ) ;  

ZonedDateTime

在时区的某个时刻,我们需要ZonedDateTime

代码语言:javascript
复制
ZonedDateTime zdt = ZonedDateTime.of( 1969 , 12 , 31 , 17 , 0 , 0 , 0 , z ) ;

zdt.toString():1969-12-31T17:00-05:00美国/纽约

Duration

若要将时间跨度表示为秒数,请使用Duration类。

代码语言:javascript
复制
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

从整秒的角度来要求整个时间跨度。

代码语言:javascript
复制
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

代码语言:javascript
复制
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.DateCalendarSimpleDateFormat

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 8Java 9Java 10Java 11和更高版本--捆绑实现的标准Java的一部分。
    • Java 9添加了一些次要的特性和修复。

  • Java 6Java 7
    • 大多数java.time功能都是在http://www.threeten.org/threetenbp/中移植到Java6&7中的。

  • 安卓
    • 较晚版本的Android实现的java.time类。
    • 对于早期的Android (<26),https://github.com/JakeWharton/ThreeTenABP项目采用了http://www.threeten.org/threetenbp/ (上面提到的)。见http://stackoverflow.com/q/38922754/642706

三次-额外项目使用其他类扩展java.time。这个项目是将来可能加入java.time的试验场。您可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter更多

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19773527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档