提问人:skippy130 提问时间:2/15/2023 最后编辑:Anonymousskippy130 更新时间:2/15/2023 访问量:217
Java 将检索到的时间戳转换为即时时间会给出错误的日期
Java Converting Retrieved TimeStamp to Instant Gives Wrong Day
问:
我制作了一个简单的方法,用于将从数据库检索到的时间戳转换为 LocalDate。但是,由于某种原因,我在转换中总是得到错误的日期。我在下面分享了代码。
private LocalDate getLocalDateFromTimeStamp(Row row, String key){
return LocalDate.parse(row.getTimestamp(key).toInstant().atZone(ZoneOffset.UTC).toLocalDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
}
所以我期待的日期是 2022-12-21,但我得到的是 2022-12-22。
当我调试并检查什么时
row.getTimestamp(键)
给我一个对象,这是我所期望的。Date
Wed Dec 21 20:47:46 CST 2022
当我检查什么时
row.getTimestamp(键).toInstant()
是的,我得到“2022-12-22T02:47:46.299Z”。我认为这就是问题出现的地方,我不确定为什么会发生这种情况。该方法返回的 LocalDate 为“2022-12-22”。
如果有人能对此有所了解,我将不胜感激,因为我不明白为什么会发生这种情况。
答:
试试这个。有关以下参数的详细信息,请查看 DateTimeFormatter。
String date = "Wed Dec 21 20:47:46 CST 2022";
EEE
三个字母的星期几MMM
三个字母月份dd
整数日HH:mm:ss
使用 24 小时制的时间z
时区名称 (CST)yyyy
年
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss z yyyy");
LocalDate dt = LocalDateTime.parse(date, dtf).toLocalDate();
System.out.println(dt);
指纹
2022-12-21
更新
如果您确实有 的实例,您可以尝试以下操作:Date
LocalDate ldt = LocalDate.ofInstant(date.toInstant(),
ZoneId.systemDefault());
评论
Date
DateTimeFormatter
TL的;博士
避免不必要的字符串操作。将日期时间类型用于日期时间值。
myResultSet
.getObject( … , OffsetDateTime.class ) // For any database column of a data type akin to the SQL standard type of `TIMESTAMP WITH TIME ZONE`.
.toLocalDate() // Extract the date portion from the returned `OffsetDateTime` object.
.toString() // Generate text in standard ISO 8601 format.
详
该类是现在遗留的可怕的日期时间类的一部分。仅使用它们的替代品,即 JSR 310 中定义的现代 java.time 类。Timestamp
而不是 ,用于 JDBC 4.2 及更高版本。对数据类型类似于 SQL 标准类型的任何数据库列执行此操作。Timestamp
OffsetDateTime
TIMESTAMP WITH TIME ZONE
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
您的问题不清楚,但您似乎希望该时刻的日期部分与UTC的偏移量为零小时-分钟-秒。
检索到的可能已经在 UTC 中。但让我们确定:OffsetDateTime
OffsetDateTime odtUtc = odt.withOffsetSameInstant( ZoneOffset.UTC ) ;
提取日期部分。
LocalDate localDate = odtUtc.toLocalDate() ;
要生成标准 ISO 8601 格式的文本,请调用 。toString
String output = localDate.toString() ;
评论
getTimeStamp(key)
Row
getTimestamp()
Date
Instant
.atZone(ZoneOffset.UTC)
return row.getTimestamp(key).toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
2022-12-21