文
章
目
录
章
目
录
学习使用Java中的DateTimeFormatter类将字符串转换为日期时间实例类,例如ZonedDateTime或OffsetDateTime类。
1.Instant、OffsetDateTime和ZonedDateTime类
在Java 8中,OffsetDateTime和ZonedDateTime都存储了瞬时在通用时间线上的纳秒精度。
- OffsetDateTime增加了从UTC的偏移量,这使得本地日期时间可以被获得。当我们需要更详细地模拟日期时间概念,或者与数据库或网络协议通信时,可以使用OffsetDateTime。
- ZonedDateTime在处理日期时使用完整时区规则。我们可以使用ZonedDateTime在UI中显示时间。它遵守DST(夏令时)规则。请注意,在DST更改期间,时区偏移量可能会根据时区ID而变化。
2. 将字符串解析为UTC中的OffsetDateTime
带有偏移信息的日期时间以任何模式表示。例如,如果我们使用模式“03/08/2019T16:20:17:717+05:30”,则此时间戳表示在“+05:30”偏移量处的瞬时。
下面是一个Java程序,用于将字符串转换为OffsetDateTime并获取等效的UTC瞬时。它使用withOffsetSameInstant(ZoneOffset.UTC)函数将给定的瞬时转换为UTC瞬时。
字符串中的’Z’代表UTC时区。它是Zulu的缩写形式,可以写成UTC +0:00。
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) throws Exception
{
DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter
.ofPattern("dd/MM/uuuu'T'HH:mm:ss:SSSXXXXX");
//带有偏移量的日期字符串
String dateString = "03/08/2019T16:20:17:717+05:30";
//带有偏移量的实例化
OffsetDateTime odtInstanceAtOffset = OffsetDateTime.parse(dateString, DATE_TIME_FORMATTER);
//UTC实例化
OffsetDateTime odtInstanceAtUTC = odtInstanceAtOffset.withOffsetSameInstant(ZoneOffset.UTC);
//格式化为字符串
String dateStringInUTC = odtInstanceAtUTC.format(DATE_TIME_FORMATTER);
System.out.println(odtInstanceAtOffset);
System.out.println(odtInstanceAtUTC);
System.out.println(dateStringInUTC);
//将OffsetDateTime转换为UTC中的即时时间
System.out.println(odtInstanceAtOffset.toInstant());
}
}
程序输出。
2019-08-03T16:20:17.717+05:30
2019-08-03T10:50:17.717Z
03/08/2019T10:50:17:717Z
2019-08-03T10:50:17.717Z
3. 将字符串解析为UTC中的ZonedDateTime
带有完整时区信息的日期时间可以表示为以下格式:
- dd/MM/uuuu’T’HH:mm:ss:SSSXXXXX模式,例如“03/08/2019T16:20:17:717+05:30”。
- MM/dd/yyyy’T’HH:mm:ss:SSS z模式,例如“08/03/2019T16:20:17:717 UTC+05:30”。
在这个例子中,时间戳表示在“+05:30”偏移量处的瞬时,即IST。
下面是一个Java程序,用于将字符串转换为ZonedDateTime并获取等效的UTC瞬时。它使用withZoneSameInstant(ZoneOffset.UTC)方法获取UTC时区ID中的瞬时。
Parse String to ZonedDateTimeimport java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) throws Exception
{
DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter
.ofPattern("MM/dd/yyyy'T'HH:mm:ss:SSS z");
//带有时区信息的日期字符串
String dateString = "08/03/2019T16:20:17:717 UTC+05:30";
//实例化带有时区的日期
ZonedDateTime zdtInstanceAtOffset = ZonedDateTime.parse(dateString, DATE_TIME_FORMATTER);
//UTC实例化
ZonedDateTime zdtInstanceAtUTC = zdtInstanceAtOffset.withZoneSameInstant(ZoneOffset.UTC);
//格式化为字符串
String dateStringInUTC = zdtInstanceAtUTC.format(DATE_TIME_FORMATTER);
System.out.println(zdtInstanceAtOffset);
System.out.println(zdtInstanceAtUTC);
System.out.println(dateStringInUTC);
//Convert ZonedDateTime to instant which is in UTC
System.out.println(zdtInstanceAtOffset.toInstant());
}
}
程序输出。