我正在使用JodaTime 1.6.2。
我有一个LocalDate
我需要转换为(Joda)LocalDateTime
或java.sqlTimestamp
进行ormapping。
原因是我已经找到了如何在LocalDateTime
和java.sql.Timestamp
之间进行转换:
LocalDateTime ldt = new LocalDateTime();
DateTimeFormatter dtf = DateTimeFormatter.forPattern("yyyy-MM-dd HH:mm:ss");
Timestamp ts = Timestamp.valueOf(ldt.toString(dtf));
因此,如果我可以在LocalDate
和LocalDateTime
之间进行转换,那么我可以继续转换为java.sql.Timestamp
。感谢任何朝着正确方向的推动!
答案 0 :(得分:230)
要将JodaTime的org.joda.time.LocalDate
转换为java.sql.Timestamp
,只需执行
Timestamp timestamp = new Timestamp(localDate.toDateTimeAtStartOfDay().getMillis());
要将JodaTime的org.joda.time.LocalDateTime
转换为java.sql.Timestamp
,只需执行
Timestamp timestamp = new Timestamp(localDateTime.toDateTime().getMillis());
要将Java8的java.time.LocalDate
转换为java.sql.Timestamp
,只需执行
Timestamp timestamp = Timestamp.valueOf(localDate.atStartOfDay());
要将Java8的java.time.LocalDateTime
转换为java.sql.Timestamp
,只需执行
Timestamp timestamp = Timestamp.valueOf(localDateTime);
答案 1 :(得分:49)
使用Java 8时间API的最佳方式:
LocalDateTime ldt = timeStamp.toLocalDateTime();
Timestamp ts = Timestamp.valueOf(ldt);
与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();
}
}
所以现在它是相对时区独立的时间。 此外,它很容易做到:
LocalDate ld = ldt.toLocalDate();
LocalTime lt = ldt.toLocalTime();
格式:
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);
更新:postgres 9.4.1208,HSQLDB 2.4.0等在没有任何对话的情况下理解Java 8 Time API!
答案 2 :(得分:8)
Joda-Time项目处于维护模式,现在由 java.time 类取代。
java.time.Instant
类。LocalDateTime
java.sql.Timestamp
以UTC格式捕获当前时刻。
Instant.now()
将该时刻存储在数据库中:
myPreparedStatement.setObject( … , Instant.now() ) // Writes an `Instant` to database.
从数据库中检索那一刻:
myResultSet.getObject( … , Instant.class ) // Instantiates a `Instant`
将挂钟时间调整为特定时区的时间。
instant.atZone( z ) // Instantiates a `ZonedDateTime`
LocalDateTime
是错误的类其他答案是正确的,但他们没有指出LocalDateTime
是出于你的目的的错误类。
在 java.time 和 Joda-Time 中,LocalDateTime
故意缺少任何时区概念或从UTC偏移。因此,它不代表片刻,并且不时间轴上的一个点。 LocalDateTime
表示在大约26-27小时范围内潜在时刻的粗略概念。
当区域/偏移未知(不是一个好的情况),或者区域偏移是不确定的时,使用LocalDateTime
。例如,“圣诞节从2018年12月25日的第一时刻开始”将表示为LocalDateTime
。
使用ZonedDateTime
表示特定时区的片刻。例如,从任何特定区域(例如Pacific/Auckland
或America/Montreal
开始的圣诞节将使用ZonedDateTime
对象表示。
总是使用UTC时,请使用Instant
。
Instant instant = Instant.now() ; // Capture the current moment in UTC.
申请时区。同一时刻,时间轴上的相同点,但以不同的挂钟时间查看。
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ; // Same moment, different wall-clock time.
所以,如果我可以在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 ) ;
如果您希望将当天的第一时刻作为您的时间,请让 java.time 确定该时刻。不要假设这一天从00:00:00开始。夏令时(DST)等异常表示该日可能会在01:00:00等其他时间开始。
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
java.sql.Timestamp
是错误的类 java.sql.Timestamp
是现在遗留下来的麻烦旧日期时间类的一部分,完全由 java.time 类取代。该类用于表示UTC中具有nanoseconds分辨率的时刻。这个目的现在由java.time.Instant
提供。
getObject
/ setObject
从JDBC 4.2开始,之后,您的JDBC driver可以通过调用以下方式直接与数据库交换java.time对象:
例如:
myPreparedStatement.setObject( … , instant ) ;
......和......
Instant instant = myResultSet.getObject( … , Instant.class ) ;
如果必须与尚未更新为 java.time 的旧代码连接,请使用添加到旧类中的新方法来回转换。
Instant instant = myJavaSqlTimestamp.toInstant() ; // Going from legacy class to modern class.
...和...
java.sql.Timestamp myJavaSqlTimestamp = java.sql.Timestamp.from( instant ) ; // Going from modern class to legacy class.
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和&amp; SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 3 :(得分: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);
答案 4 :(得分:2)
由于Joda变得褪色,有人可能希望在Java 8中将LocaltDate
转换为LocalDateTime
。在Java 8 LocalDateTime
中,它将提供一种创建LocalDateTime
的方法使用LocalDate
和LocalTime
的实例。查看here.
public static LocalDateTime(LocalDate date, LocalTime time)
样本将是,
// just to create a sample LocalDate
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate ld = LocalDate.parse("20180306", dtf);
// convert ld into a LocalDateTime
// We need to specify the LocalTime component here as well, it can be any accepted value
LocalDateTime ldt = LocalDateTime.of(ld, LocalTime.of(0,0)); // 2018-03-06T00:00
仅供参考,可以使用下面的纪元秒,
ZoneId zoneId = ZoneId.systemDefault();
long epoch = ldt.atZone(zoneId).toEpochSecond();
// If you only care about UTC
long epochUTC = ldt.toEpochSecond(ZoneOffset.UTC);
答案 5 :(得分:0)
Java8 +
import java.time.Instant;
Instant.now().getEpochSecond(); //timestamp in seconds format (int)
Instant.now().toEpochMilli(); // timestamp in milliseconds format (long)
答案 6 :(得分:0)
在asStartOfDay()
对象上进行的函数调用java.time.LocalDate
返回一个java.time.LocalDateTime
对象