0

如何将a转换2021-09-29T17:04:31.0000 +05:302021-09-29 17:04:31.0000000 Asia/CalcuttaJava?

还有一个问题在这里-我尝试了很多方法来获取timezone(Asia/Calcutta)offset(+05:30)无法获取。有人可以帮忙吗?

4

3 回答 3

4

由于您无法从偏移量(可靠地)派生区域,因此您可能需要使用解决方法/不同的方法。

这是一个示例,它使用合适String的方法将输入解析为 a ,然后创建所需的应用程序以创建.OffsetDateTimeDateTimeFormatterZoneIdOffsetDateTimeZonedDateTime

public static void main(String[] args) {
    // your example input
    String offsetTime = "2021-09-29T17:04:31.0000 +05:30";
    // define a formatter that parses a String of this format
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSS xxx");
    // then parse it to an object that knows date, time and offset
    OffsetDateTime odt = OffsetDateTime.parse(offsetTime, dtf);
    // print the result
    System.out.println(odt);

    // now define the desired zone
    ZoneId asiaCalcutta = ZoneId.of("Asia/Calcutta");
    // and use the offset-aware object to apply the zone
    ZonedDateTime zdt = odt.atZoneSameInstant(asiaCalcutta);
    // print it
    System.out.println(zdt);
}

这输出

2021-09-29T17:04:31+05:30
2021-09-29T17:04:31+05:30[Asia/Calcutta]

请注意:只有当偏移量和区域实际匹配时,这才会保持相同的偏移量。我不知道你的具体要求,所以只有你才能知道这种方法是否适合你的情况。

如果您想找出当前使用特定偏移量的时区,然后让您的代码决定哪个是正确的,您可能想看看这个问题及其答案

于 2021-10-05T14:30:44.607 回答
1

如何使用 java.time 获取与偏移量匹配的时

我倾向于从您在 Arvind Kumar Avinash 回答下的评论中了解到,您只需采用具有正确偏移量(或您认为是正确偏移量)的第一个时区即可解决该问题。当然,现代 Java 日期和时间 API java.time 可以做到这一点。我想告诉你一个方法。

    String input = "2021-09-29T17:04:31.0000 +05:30";
    
    // Remove space and parse
    OffsetDateTime dateTime = OffsetDateTime.parse(input.replace(" ", ""));
    ZoneOffset offset = dateTime.getOffset();
    
    // Find and convert to a zone that matches the offset (there will usually be many)
    ZonedDateTime zonedDateTime = ZoneId.getAvailableZoneIds()
            .stream()
            .map(ZoneId::of)
            .map(dateTime::atZoneSameInstant)
            .filter(zdt -> zdt.getOffset().equals(offset))
            .findFirst()
            // If all else fails, use the offset as time zone
            .orElse(dateTime.atZoneSameInstant(offset));
    
    // Convert to 2021-09-29 17:04:31.0000000 Asia/Calcutta format
    String result = zonedDateTime.format(FORMATTER);
    
    System.out.println(result);

我已使用此格式化程序来格式化输出:

private static final DateTimeFormatter FORMATTER
        = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSSSSS VV", Locale.ROOT);

输出是(在我的 Java 11 上):

2021-09-29 17:04:31.000000 亚洲/加尔各答

Asia/Kolkata 是时区的现在名称,以前称为 Asia/Calcutta。够近了吗?

在我的代码中,我考虑了不存在合适时区的情况。让我们看看这个偏移量,我认为它不会在任何实时区域中使用:

    String input = "2021-10-06T18:54:31.0000 +00:30";

2021-10-06 18:54:31.000000 +00:30

如果您不想要这个,您至少需要将调用更改为orElse().

于 2021-10-06T18:28:37.983 回答
1

我尝试编写此代码以涵盖三种可能性String 参数,或 LocalDateTime 参数ZonedDateTime 参数

      import java.time.LocalDateTime;
      import java.time.ZoneId;
      import java.time.ZonedDateTime;
      import java.time.format.DateTimeFormatter;

      public class SpecialFormater {

   // parameter : ZonedDateTime
   public static String specialFormaterZonedDateTime(ZonedDateTime zdt) {

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSS");
    ZoneId zid = zdt.getZone();
    System.out.println("Your initial format                =" + zdt);
    String result = "Your expected format               =" + zdt.format(formatter) + " " + zid;

    return result;
}
  // parameter : LocalDateTime
 public static String specialFormaterLocalDateTime(LocalDateTime dt) {

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSS");

    ZoneId zid = ZoneId.of("Asia/Calcutta");

    System.out.println("Your initial format                =" + dt);
    ZonedDateTime zdt = ZonedDateTime.of(dt, zid);
    System.out.println("Your zoned dateTime default format =" + zdt);
    String result = "Your expected format               =" + dt.format(formatter) + " " + zid;

    return result;
}

// Parameter : String
public static String specialFormaterString(String localDateTime) {
    System.out.println("String before formatting   =" + localDateTime);
    String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSS xxx";
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
    LocalDateTime dt = LocalDateTime.parse(localDateTime, formatter);
    ZoneId zid = ZoneId.of("Asia/Calcutta");

    DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSS");
    String result = "String after  formatting   =" + dt.format(formatter2) + " " + zid;
    return result;
}

public static void main(String[] args) {
System.out.println("specialFormaterLocalDateTime");
    System.out.println(specialFormaterLocalDateTime(LocalDateTime.now()));
    System.out.println("***********");
    System.out.println();
    System.out.println("specialFormaterString");
    System.out.println(specialFormaterString("2021-09-29T17:04:31.0000 +05:30"));
    System.out.println("**********");       
    System.out.println();
    System.out.println("specialFormaterZonedDateTime");
    System.out.println(specialFormaterZonedDateTime(ZonedDateTime.now()));
}
}

输出 :

  specialFormaterLocalDateTime
  Your initial format                =2021-10-06T12:35:45.029
  Your zoned dateTime default format =2021-10-06T12:35:45.029+05:30[Asia/Calcutta]
  Your expected format               =2021-10-06 12:35:45.0290000 Asia/Calcutta
  ***********

  specialFormaterString
  String before formatting   =2021-09-29T17:04:31.0000 +05:30
  String after  formatting   =2021-09-29 17:04:31.0000000 Asia/Calcutta
  **********

  specialFormaterZonedDateTime
  Your initial format                =2021-10-06T12:35:45.064+02:00[Europe/Paris]
  Your expected format               =2021-10-06 12:35:45.0640000 Europe/Paris
于 2021-10-06T09:58:52.447 回答