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/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" , " " )
;
您可以定义自定义格式模式,而不是这种操作。搜索 Stack Overflow,因为这已经被讨论过很多次了。
关于java.time
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 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。
从哪里获得 java.time 类?