[英]convert MYSQL datetime value to UTC Timezone format yyyy-MM-dd'T'HH:mm:ss'Z'
[英]How to convert LocalDateTime to `"yyyy-MM-dd'T'HH:mm:ss'Z'"` format
我正在嘗試將格式為"yyyy-MM-dd'T'HH:mm:ss'Z'"
的字符串解析為LocalDateTime
,如果日期是sunday
或saturday
我想將日期更改為monday
並以相同的格式返回,我知道我可以使用plusDays
添加天數
String str = "2018-09-22T12:30:10Z";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'");
LocalDateTime dateTime = LocalDateTime.parse(str, formatter);
System.out.println(dateTime.plusDays(2)); //2018-09-24T12:30:10
但我想以2018-09-24T12:30:10Z
格式返回
使用Instant
,而不是LocalDateTime
。
Instant // Represent a moment as seen in UTC (an offset of zero hours-minutes-seconds).
.parse( "2018-01-23T01:23:45.123456789Z" ) // Parse text in standard ISO 8601 format where the `Z` on the end means UTC.
.truncatedTo( java.time.temporal.ChronoUnit.SECONDS ) // Lop off any fractional second.
.plus( // Date-time math.
Duration.ofDays( 2 ) // Represent a span-of-time not attached to the timeline.
) // Returns another `Instant` object rather than altering the original.
.toString() // Generate text in standard ISO 8601 format.
2018-01-25T01:23:45Z
將格式為 "yyyy-MM-dd'T'HH:mm:ss'Z'" 的字符串解析為 LocalDateTime
你不能。 或者不應為此目的使用LocalDateTime
。
您的輸入字符串采用標准ISO 8601格式。 末尾的Z
表示UTC ,發音為“Zulu”。 你永遠不應該忽略這個字符,因為你似乎有意在它周圍使用單引號。
Instant
將這樣的字符串解析為Instant
,UTC 中的一個時刻。
Instant instant = Instant.parse( "2018-01-23T01:23:45.123456789Z" ) ;
LocalDateTime
LocalDateTime
類不能表示片刻。 它故意缺少任何時區或 UTC 偏移量的概念。 這個類代表了大約 26-27 小時范圍內的潛在時刻,全球目前使用的各個時區。
OffsetDateTime
要通過 JDBC 與數據庫通信,請使用OffsetDateTime
。
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
ZonedDateTime
要通過某個地區(時區)的人們使用的掛鍾時間的鏡頭查看該Instant
的時刻,請應用ZoneId
以獲取ZonedDateTime
對象。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
要測試周末,請在EnumSet
使用DayOfWeek
枚舉。
Set< DayOfWeek > weekend = EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SATURDAY ) ;
對於任何給定時刻,日期在全球各地因時區而異。 例如,在法國巴黎午夜過后幾分鍾是新的一天,而在魁北克蒙特利爾仍然是“昨天”。 因此,將Instant
調整為適合您業務問題的時區,如上所示。
通過從ZonedDateTime
提取DayOfWeek
枚舉對象進行比較。
DayOfWeek dow = zdt.getDayOfWeek() ;
比較一下是周末還是工作日。
ZonedDateTime target = zdt ; // Initialize.
if( weekend.contains( dow ) ) {
target = zdt.with( TemporalAdjusters.next( DayOfWeek.MONDAY ) ) ; // Move from one day to another.
}
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-Extra項目用額外的類擴展了 java.time。 該項目是未來可能添加到 java.time 的試驗場。 您可以在這里找到一些有用的類,比如Interval
, YearWeek
, YearQuarter
,和更多。
String str = "2018-09-22T12:30:10Z";
OffsetDateTime dateTime = OffsetDateTime.parse(str);
DayOfWeek dow = dateTime.getDayOfWeek();
if (dow.equals(DayOfWeek.SATURDAY) || dow.equals(DayOfWeek.SUNDAY)) {
dateTime = dateTime.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
}
System.out.println(dateTime);
這個片段的輸出是:
2018-09-24T12:30:10Z
它從字符串中獲取日期,在本例中為 9 月 22 日,並且由於它是星期六,它確實會調整到下一個星期一。 它不使用 JVM 的時區設置。
您的字符串采用 ISO 8601 格式,這是 java.time 中的類作為其默認解析和生成的標准格式,因此無需通過任何DateTimeFormatter
指定格式。 字符串中的Z
表示 UTC(換句話說,從 UTC 偏移 0),因此將其解析為偏移量並解析為OffsetDateTime
而不是LocalDateTime
以保留字符串中的所有信息。 這也使得返回相同格式變得容易。
如果需要返回String
,請使用dateTime.toString()
。
轉換為Instant
時間。
System.out.println(dateTime.plusDays(2).toInstant(ZoneOffset.UTC)));
試試這個
String str = "2018-09-22T12:30:10Z";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'");
LocalDateTime dateTime = LocalDateTime.parse(str, formatter);
System.out.println(dateTime.plusDays(2).format(formatter));
輸出:
2018-09-24T12:30:10Z
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.