IAm*_*aja 112 java timestamp jodatime
我正在使用JodaTime 1.6.2.
我有一个LocalDate
我需要转换为(Joda)LocalDateTime
或java.sqlTimestamp
for ormapping.
原因是我已经想出如何在a LocalDateTime
和a 之间进行转换java.sql.Timestamp
:
LocalDateTime ldt = new LocalDateTime();
DateTimeFormatter dtf = DateTimeFormatter.forPattern("yyyy-MM-dd HH:mm:ss");
Timestamp ts = Timestamp.valueOf(ldt.toString(dtf));
Run Code Online (Sandbox Code Playgroud)
所以,如果我可以相互转换LocalDate
和LocalDateTime
的话,我可以让继续转换java.sql.Timestamp
.感谢任何正确方向的推动!
Bal*_*usC 249
要将JodaTime转换org.joda.time.LocalDate
为java.sql.Timestamp
,请执行此操作
Timestamp timestamp = new Timestamp(localDate.toDateTimeAtStartOfDay().getMillis());
Run Code Online (Sandbox Code Playgroud)
要将JodaTime转换org.joda.time.LocalDateTime
为java.sql.Timestamp
,请执行此操作
Timestamp timestamp = new Timestamp(localDateTime.toDateTime().getMillis());
Run Code Online (Sandbox Code Playgroud)
要将Java8转换java.time.LocalDate
为java.sql.Timestamp
,只需这样做
Timestamp timestamp = Timestamp.valueOf(localDate.atStartOfDay());
Run Code Online (Sandbox Code Playgroud)
要将Java8转换java.time.LocalDateTime
为java.sql.Timestamp
,只需这样做
Timestamp timestamp = Timestamp.valueOf(localDateTime);
Run Code Online (Sandbox Code Playgroud)
GKi*_*lin 56
使用Java 8时间API的最佳方法:
LocalDateTime ldt = timeStamp.toLocalDateTime();
Timestamp ts = Timestamp.valueOf(ldt);
Run Code Online (Sandbox Code Playgroud)
与JPA一起使用您的模型(https://weblogs.java.net/blog/montanajava/archive/2014/06/17/using-java-8-datetime-classes-jpa):
@Converter(autoApply = true)
public class LocalDateTimeConverter implements AttributeConverter<LocalDateTime, Timestamp> {
@Override
public Timestamp convertToDatabaseColumn(LocalDateTime ldt) {
return Timestamp.valueOf(ldt);
}
@Override
public LocalDateTime convertToEntityAttribute(Timestamp ts) {
return ts.toLocalDateTime();
}
}
Run Code Online (Sandbox Code Playgroud)
所以现在它是相对时区独立的时间.此外,它很容易做到:
LocalDate ld = ldt.toLocalDate();
LocalTime lt = ldt.toLocalTime();
Run Code Online (Sandbox Code Playgroud)
格式:
DateTimeFormatter DATE_TME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")
String str = ldt.format(DATE_TME_FORMATTER);
ldt = LocalDateTime.parse(str, DATE_TME_FORMATTER);
Run Code Online (Sandbox Code Playgroud)
更新:postgres 9.4.1208,HSQLDB 2.4.0等在没有任何对话的情况下理解Java 8 Time API!
Bas*_*que 14
该乔达时间项目处于维护模式,现在取代java.time类.
java.time.Instant
课程.LocalDateTime
java.sql.Timestamp
捕获UTC中的当前时刻.
Instant.now()
Run Code Online (Sandbox Code Playgroud)
要将该时刻存储在数据库中:
myPreparedStatement.setObject( … , Instant.now() ) // Writes an `Instant` to database.
Run Code Online (Sandbox Code Playgroud)
要从数据库中检索该时刻:
myResultSet.getObject( … , Instant.class ) // Instantiates a `Instant`
Run Code Online (Sandbox Code Playgroud)
将挂钟时间调整为特定时区的挂钟时间.
instant.atZone( z ) // Instantiates a `ZonedDateTime`
Run Code Online (Sandbox Code Playgroud)
LocalDateTime
是错的班级其他答案是正确的,但他们没有指出这LocalDateTime
是你的目的错误的类.
在java.time和Joda-Time中,LocalDateTime
故意缺乏任何时区概念或从UTC偏移.因此,它并不能代表一个时刻,是不是在时间轴上的一个点.A LocalDateTime
表示关于大约26-27小时范围内的潜在时刻的粗略概念.
使用LocalDateTime
的既可以当偏移区域/未知(不是一个好的情况),或者当区域偏移是不确定的.例如,"圣诞节从2018年12月25日的第一时刻开始"将表示为LocalDateTime
.
使用a ZonedDateTime
表示特定时区的时刻.例如,圣诞节从任何特定区域开始,例如Pacific/Auckland
或America/Montreal
将用ZonedDateTime
对象表示.
总是在UTC中,请使用Instant
.
Instant instant = Instant.now() ; // Capture the current moment in UTC.
Run Code Online (Sandbox Code Playgroud)
应用时区.同一时刻,时间轴上的相同点,但以不同的挂钟时间查看.
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ; // Same moment, different wall-clock time.
Run Code Online (Sandbox Code Playgroud)
所以,如果我可以在LocalDate和LocalDateTime之间进行转换,
不,错误的策略.如果您有一个仅限日期的值,并且您想要一个日期时间值,则必须指定一个时间.对于特定区域,该日期可能在该日期无效 - 在这种情况下,ZonedDateTime
类会根据需要自动调整时间.
LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
LocalTime lt = LocalTime.of( 14 , 0 ) ; // 14:00 = 2 PM.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
Run Code Online (Sandbox Code Playgroud)
如果您希望将当天的第一时刻作为您的时间,请让java.time确定该时刻.不要假设这一天从00:00:00开始.夏令时(DST)等异常表示该日可能会在另一个时间开始,例如01:00:00.
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
Run Code Online (Sandbox Code Playgroud)
java.sql.Timestamp
是错的班级这java.sql.Timestamp
是现在遗留下来的麻烦的旧日期时间类的一部分,完全由java.time类取代.该类用于表示UTC的分钟,分辨率为纳秒.这个目的现在可以用了java.time.Instant
.
getObject
/setObject
从JDBC 4.2及更高版本开始,您的JDBC驱动程序可以通过调用以下命令直接与数据库交换java.time对象:
例如:
myPreparedStatement.setObject( … , instant ) ;
Run Code Online (Sandbox Code Playgroud)
......而且......
Instant instant = myResultSet.getObject( … , Instant.class ) ;
Run Code Online (Sandbox Code Playgroud)
如果必须与尚未更新到java.time的旧代码接口,请使用添加到旧类的新方法来回转换.
Instant instant = myJavaSqlTimestamp.toInstant() ; // Going from legacy class to modern class.
Run Code Online (Sandbox Code Playgroud)
…和…
java.sql.Timestamp myJavaSqlTimestamp = java.sql.Timestamp.from( instant ) ; // Going from modern class to legacy class.
Run Code Online (Sandbox Code Playgroud)
该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
,和更多.
小智 5
根据您的时区,您可能会丢失几分钟(1650-01-01 00:00:00变为1649-12-31 23:52:58)
使用以下代码来避免这种情况
new Timestamp(localDateTime.getYear() - 1900, localDateTime.getMonthOfYear() - 1, localDateTime.getDayOfMonth(), localDateTime.getHourOfDay(), localDateTime.getMinuteOfHour(), localDateTime.getSecondOfMinute(), fractional);
Run Code Online (Sandbox Code Playgroud)