如何在时区EST中将long值转换为java.util.Date?

时间:2019-12-30 21:22:26

标签: java datetime

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

使用Java 7。

3 个答案:

答案 0 :(得分: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版本<8的方法。请参见此处,对America / New_York与getTimeZone(“ EST”)进行更广泛的讨论,但这可能是您想要的-但据那里的作者说,也许不是]

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

tl; dr

new Date().setTime( milliseconds )

java.util.Date::setTime

  

我正在寻找另一种解决方案:将一个长值转换为Date对象

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

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时区)

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

关于“时区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" , " " ) 
;

您可以定义自定义格式样式,而不是这种操作。搜索堆栈溢出,因为已经有很多次了。


关于 java.time

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

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

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

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

在哪里获取java.time类?