如何将 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.outing 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.timemodern 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