【问题标题】:how to convert long value to java.util.Date in timezone EST? [closed]如何在时区 EST 中将 long 值转换为 java.util.Date? [关闭]
【发布时间】:2019-12-30 21:22:26
【问题描述】:

如何将 long 值转换为格式为“yyyy-MM-dd HH:mm:ss”的日期对象(在时区 EST 中)。我正在寻找另一种解决方案:将长值转换为日期对象。

使用 Java 7。

【问题讨论】:

标签: java datetime


【解决方案1】:

即使在 java 7 中,以下方法也应该可以工作。

Date d = new Date(1527152472);//pass in whatever long value you have to the date constructor
SimpleDateFormat simpleDateFormat =
    new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//sets the format you want
TimeZone etTimeZone = TimeZone.getTimeZone("America/New_York");
simpleDateFormat.setTimeZone(etTimeZone);// sets the time zone of the formatter
System.out.println(simpleDateFormat.format(d));//gives the formatted date

参考: https://docs.oracle.com/javase/7/docs/api/java/util/Date.html#Date(long) [在 java 7 中显示带有长参数的日期构造函数——不推荐使用]

https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html [显示 java 7 中的 SimpleDateFormat]

https://howtodoinjava.com/java/date-time/convert-date-time-to-est-est5edt/ [我使用了 Java 版本

【讨论】:

  • 感谢您的帮助,您是我正在寻找的最接近的。
【解决方案2】:

tl;博士

new Date().setTime( milliseconds )

java.util.Date::setTime

我正在寻找相反的解决方案:将长值转换为日期对象

假设“长值”是指自 1970 年 UTC 第一刻以来的毫秒数:

java.util.Date d = new Date() ;
d.setTime( millis ) ;

org.threeten.bp.Instant

java.util.Date 类很糟糕,现在是遗留问题。多年前被现代 java.time 类取代。专门替换为java.time.Instant 类。

java.time 类内置于 Java 8 及更高版本中。对于 Java 6 和 Java 7,请使用后向端口库 ThreeTen-Backport

org.threeten.bp.Instant instant = Instant.ofEpochMilli( millis ) ;

如果您必须与旧代码互操作,请转换为 java.util.Date

java.util.Date d = org.threeten.bp.DateTimeUtils.toDate( instant ) ;

反之亦然。

org.threeten.bp.Instant instant = org.threeten.bp.DateTimeUtils.toInstant( d ) ;

字符串

至于……

格式为“yyyy-MM-dd HH:mm:ss”的日期对象(在时区EST中)

…日期时间对象没有“格式”。他们可以生成以各种格式表示其内部价值的文本。但是它们生成或解析的字符串是不同的,并且与日期时间对象分开。

至于“timezone EST”,没有这样的东西。以Continent/Region 的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用 2-4 个字母的缩写,例如 ESTIST,因为它们不是真正的时区,没有标准化,甚至不是唯一的 (!)。

我假设“EST”是指某个时区,例如 America/MontrealAmerica/New_York

org.threeten.bp.ZoneId z = ZoneId.of( "America/New_York" ) ;

将该区域应用于我们的Instant 以生成ZonedDateTime 对象。同一时刻,不同的挂钟时间。

org.threeten.bp.ZonedDateTime zdt = instant.atZone( z ) ;

生成一个字符串,表示该ZonedDateTime 对象的部分内部值。您所需的格式显示日期和时间,但省略了区域或偏移量的任何提及。我确实建议省略区域/偏移量,因为读者可能会误解并假设错误的区域。

我们可以使用预定义的格式化程序ISO_OFFSET_DATE_TIME 让我们接近您想要的格式。此格式化程序生成标准 ISO 8601 格式的文本。该标准在日期和时间部分之间指定了T。我们可以将 T 替换为 SPACE 以获得您想要的格式。

org.threeten.bp.format.DateTimeFormatter f = DateTimeFormatter.ISO_OFFSET_DATE_TIME ;
String output = 
        zdt
        .format( f )
        .replace( "T" , " " ) 
;

如果你想隐藏小数秒,你可以截断。 java.time 类使用不可变对象,因此将实例化一个新的ZonedDateTime 对象。您原来的 ZonedDateTime 对象将不会被更改。

org.threeten.bp.format.DateTimeFormatter f = DateTimeFormatter.ISO_OFFSET_DATE_TIME ;
String output = 
        zdt
        .truncatedTo( org.threeten.bp.temporal.ChronoUnit.SECONDS )  // Drops the fractional second, producing a new fresh `ZonedDateTime` object.
        .format( f )
        .replace( "T" , " " ) 
;

您可以定义自定义格式模式,而不是这种操作。搜索 Stack Overflow,因为这已经被讨论过很多次了。


关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。

从哪里获得 java.time 类?

【讨论】:

  • 感谢您的 cmets 和编辑,很遗憾,我无法选择多个最佳答案,您的回答非常有帮助。
【解决方案3】:

如何获得长值?如果你用System.currentTimeMillis 得到时间,它应该是 UTC。您可以使用 long 值创建一个新的 Date 对象,并使用此 solution 将其转换为 EST

要格式化日期,您可以使用 SimpleDateFormat

new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

【讨论】:

  • 感谢您的评论。
猜你喜欢
  • 1970-01-01
  • 2021-12-13
  • 2011-12-26
  • 2017-08-20
  • 2013-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
相关资源
最近更新 更多