![](/img/trans.png)
[英]Format a java.sql.Timestamp into UTC format for a JSON object
[英]Best way to Change java.sql.TimeStamp to UTC format in Java
我已經嘗試了多種方法,其中一種是使用 SimpleDateFromatter,現在正在嘗試
import java.sql.Timestamp;
public static String getCorrectTimeFormat(Timestamp time) {
return time.toInstant().toString();
}
但問題是我在編寫單元測試時意識到,時間被修改了。
Timestamp timeStamp = Timestamp.valueOf("2020-07-22 12:26:51.599");
String res = UserUtil.getCorrectTimeFormat(timeStamp);
assertThat(res).isEqualTo("2020-07-22T12:26:51.599Z");
這永遠不會過去,因為它會自動轉換為“2020-07-22T11:26:51.599Z”
jqva.sql.Timestamp
。 我會告訴你怎么做。由於 JDBC 4.2 我們可以直接從ResultSet
獲取 java.time 類型。 如果您的數據庫值是timestamp with time zone
(推薦),例如:
OffsetDateTime odt = rs.getObject(
"your_timestamp_with_time_zone_column", OffsetDateTime.class);
String utcString = odt.withOffsetSameInstant(ZoneOffset.UTC).toString();
如果您的數據庫值是沒有時區的timestamp
(不推薦),我們只能從中獲取一個LocalDateTime
,它沒有定義時間點。 要轉換為Instant
,我們需要知道數據庫使用哪個時區。 例如:
ZoneId datebaseTimeZone = ZoneId.of("Europe/Paris");
LocalDateTime ldt = rs.getObject(
"your_timestamp_column", LocalDateTime.class);
String utcString = ldt.atZone(datebaseTimeZone)
.withZoneSameInstant(ZoneOffset.UTC)
.toString();
如果您的數據庫使用 UTC,它算作偏移量,那么使用ZoneOffset
比使用ZoneId
更好:
ZoneOffset datebaseOffset = ZoneOffset.UTC;
LocalDateTime ldt = rs.getObject(
"your_timestamp_column", LocalDateTime.class);
String utcString = ldt.atOffset(datebaseOffset).toString();
java.sql.Timestamp
在 JVM 的默認時區中令人困惑地打印,並且Timestamp.valueOf()
同樣令人困惑地假設該時區因此,假設您的時區在一年中的這個時候位於偏移 +01:00(例如英國、愛爾蘭、葡萄牙、摩洛哥和突尼斯),則從2020-07-22 12:26:51.599
為2020-07-22T11:26:51.599Z
是正確的。
您可以使用 java 8 個時間 ZonedDateTime class:
//1 - default pattern
String timeStamp = "2019-03-27T10:15:30";
ZonedDateTime localTimeObj = ZonedDateTime.parse(time);
//2 - specified pattern
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss a z");
String timeStamp1 = "2019-03-27 10:15:30 AM";
ZonedDateTime localTimeObj1 = ZonedDateTime.parse(timeStamp1, formatter);
//To get LocalDate from ZonedDateTime
LocalDate localDate = localTimeObj1.toLocalDate()
//To get timestamp from zoneddatetime with utc timezone
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneOffset.UTC);
Timestamp timestamp = Timestamp.from(ZonedDateTime.now(ZoneOffset.UTC).toInstant());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.