Par*_*war 6 java sql java-8 java-time zoneddatetime
将Joda时间迁移到Java 8
乔达:
UserObject user = new UserObject()
user.setCreatedAt(new DateTime(rs.getTimestamp("columnName")));`
Run Code Online (Sandbox Code Playgroud)
迁移至Java 8
这是我的代码;它确实可以编译;我怀疑它是否有效:
ZonedDateTime.ofInstant(rs.getTimestamp("columnName").toLocalDateTime().toInstant(ZoneOffset.UTC),ZoneId.of("UTC")));
Run Code Online (Sandbox Code Playgroud)
在某些情况下,日期是错误的。有什么建议吗?
Bas*_*que 11
要跟踪历史记录,请Instant用作类成员变量的类型。具体而言,此刻被视为UTC中的日期和时间。
public class UserObject() {
Instant createdAt ;
…
public void setCreatedAt( Instant instantArg ) {
this.createdAt = instantArg ;
{
}
Run Code Online (Sandbox Code Playgroud)
用法,捕获当前时刻。
UserObject user = new UserObject() ;
user.setCreatedAt( Instant.now() ) ;
Run Code Online (Sandbox Code Playgroud)
用法,从数据库填充值。
UserObject user = new UserObject() ;
Instant instant = myResultSet.getObject( "when_created" , Instant.class ) ;
user.setCreatedAt( instant ) ;
Run Code Online (Sandbox Code Playgroud)
JDBC 4.2不需要Instant(在UTC中支持)。如果您的驱动程序不支持该类,请切换至该类OffsetDateTime。
UserObject user = new UserObject() ;
OffsetDateTime odt = myResultSet.getObject( "when_created" , OffsetDateTime.class ) ;
user.setCreatedAt( odt.toInstant() ) ; // Convert from an `OffsetDateTime` (for any offset-from-UTC) to `Instant` (always in UTC).
Run Code Online (Sandbox Code Playgroud)
呈现给用户,已针对用户界面进行了本地化。
user // Your business object.
.getCreatedAt() // Returns a `Instant` object.
.atZone( // Adjust from UTC to a time zone. Same moment, same point on the timeline, different wall-clock time.
ZoneId.of( "Pacific/Auckland" ) // Specify the user’s desired/expected time zone.
) // Returns a `ZonedDateTime` object.
.format( // Generate a `String` representing the value of date-time object.
DateTimeFormatter.ofLocalizedDateTime(
FormatStyle.FULL // Specify how long or abbreviated the string.
)
.withLocale( // Specify `Locale` to determine human language and cultural norms for localization.
Locale.CANADA_FRENCH
)
) // Returns a `String`.
Run Code Online (Sandbox Code Playgroud)
请注意,Locale有没有做的时区,正交问题。上面的代码可能适用于魁北克在新西兰旅行的商务人士。她想看看周围的奇异鸟使用的挂钟时间,但是她更喜欢用她的母语法语阅读其文字显示。时区和区域设置都是最好只留给演讲的问题;通常最好在其余代码中使用UTC。因此,根据定义,我们将成员变量定义createdAt为Instant,Instant始终位于UTC中。
java.sql.Timestampjava.sql.Timestamp,随着java.sql.Date,java.util.Date以及Calendar是被排挤年前由在非常麻烦的旧日期时间类的所有部分java.time类。从JDBC 4.2及更高版本开始,我们可以直接与数据库交换java.time对象。
Instant使用Instantclass 将当前时刻发送到数据库。该Instant级表示时间轴上的时刻UTC,分辨率为纳秒(最多小数的9个位数)。
Instant instant = Instant.now() ; // Capture the current moment in UTC.
myPreparedStatement.setObject( … , instant ) ;
Run Code Online (Sandbox Code Playgroud)
和检索。
Instant instant = myResultSet.getObject( … , Instant.class ) ;
Run Code Online (Sandbox Code Playgroud)
ZonedDateTime要通过特定地区(时区)的人们所使用的挂钟时间的镜头看到同一时刻,请应用ZoneId来获取ZonedDateTime。
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
Run Code Online (Sandbox Code Playgroud)
LocalDateTime是不是一时.toLocalDateTime()。
LocalDateTime代表特定时间时,切勿上课。该类故意缺少任何时区或从UTC偏移的概念。因此,它不能代表一个时刻,也不是时间轴上的一点。关于沿大约26-27小时(时区范围)内的潜在时刻,这是一个模糊的想法。
该java.time框架是建立在Java 8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC驱动程序。不需要字符串,不需要类。java.sql.*
在哪里获取java.time类?
该ThreeTen-额外项目与其他类扩展java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。你可能在这里找到一些有用的类,比如Interval,YearWeek,YearQuarter,和更多。
使用以下内容:
rs.getTimestamp("columnName").toInstant()
.atZone(ZoneId.[appropriate-zone-ID-here])
Run Code Online (Sandbox Code Playgroud)
您需要使用ZoneId适合该地区的(您可以尝试使用ZoneId.systemDefault())。
有关各种 Java-Time API 之间差异的更多详细信息,请参阅这个很好的答案。
这似乎可行:
ZonedDateTime.ofInstant(rs.getTimestamp("columnname").toInstant(), ZoneId.of("UTC"))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4310 次 |
| 最近记录: |