如何将日期字符串转换为 UTC 日期对象?
How to convert Date string into UTC Date object?
我正在学习 Java 并遇到了这个问题。我有一个给定格式的日期字符串。
String dbTime = "01/01/1998 12:30:00";
final String DATE_FORMAT = "MM/dd/yyyy HH:mm:ss";
现在我想 initialize/create UTC 时区的日期对象。
为此,我尝试了以下代码
SimpleDateFormat sdfAmerica = new SimpleDateFormat(DATE_FORMAT);
TimeZone utcTimeZone = TimeZone.getTimeZone("UTC");
sdfAmerica.setTimeZone(utcTimeZone);
String sDateInAmerica = sdfAmerica.format(date); // Convert to String first
Date dateInAmerica = new Date();
try {
dateInAmerica = formatter.parse(sDateInAmerica); // Create a new Date object
} catch (ParseException e) {
e.printStackTrace();
}
这会将时间转换为 UTC,而不仅仅是创建日期对象。
01/02/1998 23:00:00
现在我很困惑哪种才是转换时间的正确方法。
我有字符串格式的时间,我必须将它转换成不同的格式,主要是 UTC 到 PST 或 PST 到 UTC。
经过一些研究,我找到了 this 教程,但无法获得预期的输出。
java.util.Date class 不是最佳开始。虽然从外面看起来像是一个完整的日期,但实际上它只是代表一个时间戳,而没有存储实际的时区信息。
在 Java 8 及更高版本上,我建议坚持使用设计更好的 java.time。* classes.
String dbTime = "01/01/1998 12:30:00";
String DATE_FORMAT = "MM/dd/yyyy HH:mm:ss";
// parsed date time without timezone information
LocalDateTime localDateTime = LocalDateTime.parse(dbTime, DateTimeFormatter.ofPattern(DATE_FORMAT));
// local date time at your system's default time zone
ZonedDateTime systemZoneDateTime = localDateTime.atZone(ZoneId.systemDefault());
// value converted to other timezone while keeping the point in time
ZonedDateTime utcDateTime = systemZoneDateTime.withZoneSameInstant(ZoneId.of("UTC"));
// timestamp of the original value represented in UTC
Instant utcTimestamp = systemZoneDateTime.toInstant();
System.out.println(utcDateTime);
System.out.println(utcTimestamp);
正如您仅从名称中可以看出的那样,对于不同的日期用例,class有不同的名称。
java.time.LocalDateTime 例如仅表示没有特定时区上下文的日期和时间,因此可用于直接解析字符串值。
要转换时区,您首先必须转换成 ZonedDateTime,它接受日期、时间和时区。我已经在“systemDefault”上初始化了示例,因为在大多数较小的应用程序上,您可以使用 JVM 和 OS 的默认值来假定当前时区。
如果您想确保该值被解释为太平洋时间,您也可以直接使用 ZoneId.of("America/Los_Angeles")。
这个值可以转换成另一个时区的另一个 ZonedDateTime,例如UTC.
尤其是对于 UTC,您还可以使用 Instant class,它仅表示 UTC 时间戳,也可以用作大多数其他类型的基础
我正在学习 Java 并遇到了这个问题。我有一个给定格式的日期字符串。
String dbTime = "01/01/1998 12:30:00";
final String DATE_FORMAT = "MM/dd/yyyy HH:mm:ss";
现在我想 initialize/create UTC 时区的日期对象。 为此,我尝试了以下代码
SimpleDateFormat sdfAmerica = new SimpleDateFormat(DATE_FORMAT);
TimeZone utcTimeZone = TimeZone.getTimeZone("UTC");
sdfAmerica.setTimeZone(utcTimeZone);
String sDateInAmerica = sdfAmerica.format(date); // Convert to String first
Date dateInAmerica = new Date();
try {
dateInAmerica = formatter.parse(sDateInAmerica); // Create a new Date object
} catch (ParseException e) {
e.printStackTrace();
}
这会将时间转换为 UTC,而不仅仅是创建日期对象。
01/02/1998 23:00:00
现在我很困惑哪种才是转换时间的正确方法。 我有字符串格式的时间,我必须将它转换成不同的格式,主要是 UTC 到 PST 或 PST 到 UTC。
经过一些研究,我找到了 this 教程,但无法获得预期的输出。
java.util.Date class 不是最佳开始。虽然从外面看起来像是一个完整的日期,但实际上它只是代表一个时间戳,而没有存储实际的时区信息。
在 Java 8 及更高版本上,我建议坚持使用设计更好的 java.time。* classes.
String dbTime = "01/01/1998 12:30:00";
String DATE_FORMAT = "MM/dd/yyyy HH:mm:ss";
// parsed date time without timezone information
LocalDateTime localDateTime = LocalDateTime.parse(dbTime, DateTimeFormatter.ofPattern(DATE_FORMAT));
// local date time at your system's default time zone
ZonedDateTime systemZoneDateTime = localDateTime.atZone(ZoneId.systemDefault());
// value converted to other timezone while keeping the point in time
ZonedDateTime utcDateTime = systemZoneDateTime.withZoneSameInstant(ZoneId.of("UTC"));
// timestamp of the original value represented in UTC
Instant utcTimestamp = systemZoneDateTime.toInstant();
System.out.println(utcDateTime);
System.out.println(utcTimestamp);
正如您仅从名称中可以看出的那样,对于不同的日期用例,class有不同的名称。
java.time.LocalDateTime 例如仅表示没有特定时区上下文的日期和时间,因此可用于直接解析字符串值。
要转换时区,您首先必须转换成 ZonedDateTime,它接受日期、时间和时区。我已经在“systemDefault”上初始化了示例,因为在大多数较小的应用程序上,您可以使用 JVM 和 OS 的默认值来假定当前时区。 如果您想确保该值被解释为太平洋时间,您也可以直接使用 ZoneId.of("America/Los_Angeles")。
这个值可以转换成另一个时区的另一个 ZonedDateTime,例如UTC.
尤其是对于 UTC,您还可以使用 Instant class,它仅表示 UTC 时间戳,也可以用作大多数其他类型的基础