如何以“ yyyy-MM-dd HH:mm:ss”(时区EST)的格式将长值转换为Date对象。我正在寻找另一种解决方案:将long值转换为Date对象。
使用Java 7。
答案 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)
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/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用2-4个字母的缩写,例如EST
或IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
我将假设“ EST”表示某个时区,例如America/Montreal
或America/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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
目前位于Joda-Time的maintenance mode项目建议迁移到java.time类。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
在哪里获取java.time类?