如何将 UTC 日期和时间格式转换为时区时间格式?
How to convert UTC date and time format to zone time format?
我有一个生成随机日期和时间的方法。
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.Period;
public String getRandomFormattedDateAndTime() {
LocalDateTime date = generateRandomDateAndTimeInPast();
return formatDate(date);
}
public LocalDateTime generateRandomDateAndTimeInPast() {
return LocalDateTime.now()
.minus(Period.ofDays(
(new Random().nextInt(365 * 2))
));
}
public static String formatDate(LocalDateTime date) {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DATE_TIME_FORMAT_PATTERN);
return dateTimeFormatter.format(date);
}
打印输出类似于"2020-08-07T08:57:09Z"
但是,我需要使用具有 +02:00
(我的本地时间)的时区格式 2020-08-07T10:57:09+02:00
获取相同的值。
我看过几个问题和页面 like this,但他们没有给我任何线索。
在您的示例中,您使用的是 LocalDateTime
类型。 LocalDateTime 无法使用时区模式进行格式化,因为它不包含任何时区信息...
切换到 ZonedDateTime
将解决您的问题。
希望这就是您要找的:
ZonedDateTime zonedDateTime = ZonedDateTime.now().minus(Period.ofDays((new Random().nextInt(365 * 2))));
System.out.println("Date Time:" + zonedDateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
输出:日期Time:2019-07-13T14:27:51.909+05:30
注意:05:30 是我的时区(本地)偏移量
不确定为什么人们在这里涉及 ZonedDateTime
,但这似乎是一种有效的方法...
不过,我想补充一点,那就是使用一个OffsetDateTime
。
这是您方法的调整版本generateRandomDateAndTimeInPast
:
public static OffsetDateTime generateRandomDateAndTimeInPast(int offset) {
return OffsetDateTime.now(ZoneOffset.ofHours(offset))
.minusDays(
ThreadLocalRandom.current()
.nextInt(365 * 2)
);
}
一个示例用法可能如下所示,请注意通过直接 System.out
ing OffsetDateTime
的实例隐式调用 OffsetDateTime.toString()
。您可以通过调用 OffsetDateTime.format(DateTimeFormatter)
.
来更改输出
public static void main(String[] args) {
OffsetDateTime odt = generateRandomDateAndTimeInPast(2);
System.out.println(odt);
}
这会打印出格式如下(随机生成)的日期时间:
2020-10-14T10:44:23.304+02:00
如果您需要 LocalDateTime
(不包含或打印任何偏移量),您可以像这样从 OffsetDateTime
中简单地获取它:
LocalDateTime ldt = odt.toLocalDateTime();
A ZonedDateTime
也有那个方法,所以如果你使用那个或 OffsetDateTime
你总是可以通过调用 toLocalDateTime()
获得它们所基于的 LocalDateTime
.
您还没有提供方法的代码,formatDate(LocalDate)
。但是,您提到 String getRandomFormattedDateAndTime()
返回给您 2020-08-07T08:57:09Z
。下面的方法,getDateTimeInMyTz(String)
为您提供了您要找的东西:
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZoneOffset;
public class Main {
public static void main(String[] args) {
// Test
System.out.println(getDateTimeInMyTz("2020-08-07T08:57:09Z"));
}
public static String getDateTimeInMyTz(String strDtUtc) {
Instant instant = Instant.parse(strDtUtc);
ZoneOffset offset = ZoneId.systemDefault().getRules().getOffset(instant);
return instant.atOffset(offset).toString();
}
}
我时区的输出,偏移量为 +01:00
小时:
2020-08-07T09:57:09+01:00
用法: 将 getDateTimeInMyTz("2020-08-07T08:57:09Z")
替换为 getDateTimeInMyTz(getRandomFormattedDateAndTime())
。
如果您分享您的方法代码,formatDate(LocalDate)
,我可以建议进一步简化。
详细了解 java.time
、modern Date-Time API* from Trail: Date Time。
* 无论出于何种原因,如果您必须坚持Java 6 或Java 7,您可以使用ThreeTen-Backport which backports most of the java.time functionality to Java 6 & 7. If you are working for an Android project and your Android API level is still not compliant with Java-8, check Java 8+ APIs available through desugaring and 。
我有一个生成随机日期和时间的方法。
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.Period;
public String getRandomFormattedDateAndTime() {
LocalDateTime date = generateRandomDateAndTimeInPast();
return formatDate(date);
}
public LocalDateTime generateRandomDateAndTimeInPast() {
return LocalDateTime.now()
.minus(Period.ofDays(
(new Random().nextInt(365 * 2))
));
}
public static String formatDate(LocalDateTime date) {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DATE_TIME_FORMAT_PATTERN);
return dateTimeFormatter.format(date);
}
打印输出类似于"2020-08-07T08:57:09Z"
但是,我需要使用具有 +02:00
(我的本地时间)的时区格式 2020-08-07T10:57:09+02:00
获取相同的值。
我看过几个问题和页面 like this,但他们没有给我任何线索。
在您的示例中,您使用的是 LocalDateTime
类型。 LocalDateTime 无法使用时区模式进行格式化,因为它不包含任何时区信息...
切换到 ZonedDateTime
将解决您的问题。
希望这就是您要找的:
ZonedDateTime zonedDateTime = ZonedDateTime.now().minus(Period.ofDays((new Random().nextInt(365 * 2))));
System.out.println("Date Time:" + zonedDateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
输出:日期Time:2019-07-13T14:27:51.909+05:30
注意:05:30 是我的时区(本地)偏移量
不确定为什么人们在这里涉及 ZonedDateTime
,但这似乎是一种有效的方法...
不过,我想补充一点,那就是使用一个OffsetDateTime
。
这是您方法的调整版本generateRandomDateAndTimeInPast
:
public static OffsetDateTime generateRandomDateAndTimeInPast(int offset) {
return OffsetDateTime.now(ZoneOffset.ofHours(offset))
.minusDays(
ThreadLocalRandom.current()
.nextInt(365 * 2)
);
}
一个示例用法可能如下所示,请注意通过直接 System.out
ing OffsetDateTime
的实例隐式调用 OffsetDateTime.toString()
。您可以通过调用 OffsetDateTime.format(DateTimeFormatter)
.
public static void main(String[] args) {
OffsetDateTime odt = generateRandomDateAndTimeInPast(2);
System.out.println(odt);
}
这会打印出格式如下(随机生成)的日期时间:
2020-10-14T10:44:23.304+02:00
如果您需要 LocalDateTime
(不包含或打印任何偏移量),您可以像这样从 OffsetDateTime
中简单地获取它:
LocalDateTime ldt = odt.toLocalDateTime();
A ZonedDateTime
也有那个方法,所以如果你使用那个或 OffsetDateTime
你总是可以通过调用 toLocalDateTime()
获得它们所基于的 LocalDateTime
.
您还没有提供方法的代码,formatDate(LocalDate)
。但是,您提到 String getRandomFormattedDateAndTime()
返回给您 2020-08-07T08:57:09Z
。下面的方法,getDateTimeInMyTz(String)
为您提供了您要找的东西:
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZoneOffset;
public class Main {
public static void main(String[] args) {
// Test
System.out.println(getDateTimeInMyTz("2020-08-07T08:57:09Z"));
}
public static String getDateTimeInMyTz(String strDtUtc) {
Instant instant = Instant.parse(strDtUtc);
ZoneOffset offset = ZoneId.systemDefault().getRules().getOffset(instant);
return instant.atOffset(offset).toString();
}
}
我时区的输出,偏移量为 +01:00
小时:
2020-08-07T09:57:09+01:00
用法: 将 getDateTimeInMyTz("2020-08-07T08:57:09Z")
替换为 getDateTimeInMyTz(getRandomFormattedDateAndTime())
。
如果您分享您的方法代码,formatDate(LocalDate)
,我可以建议进一步简化。
详细了解 java.time
、modern Date-Time API* from Trail: Date Time。
* 无论出于何种原因,如果您必须坚持Java 6 或Java 7,您可以使用ThreeTen-Backport which backports most of the java.time functionality to Java 6 & 7. If you are working for an Android project and your Android API level is still not compliant with Java-8, check Java 8+ APIs available through desugaring and