簡體   English   中英

日期轉換:將 UTCOffset 添加到現有時區

[英]Date conversion: add UTCOffset to existing timezone

我的日期格式為(示例) Date = 2023-01-09T23:51:44.595Z 並且我有 utcOffset String utcOffset = "UTC +6"

我想要 output 作為日期格式的 2023-01-10T05:51:44.595Z。

如何實現這一目標?

我應該將 UTC 偏移量添加到現有日期。

試過這個:

public static void main(String[] args) throws ParseException {
        String rawDate = "2023-01-09T23:51:44.595Z";
        String utcOffset = "UTC +6";

        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ROOT);
        Date date = (Date) formatter.parse(rawDate);
        SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ROOT);
        String v = formatter1.format(date);
        System.out.println("Original raw date::::::::::"+v);
        
        System.out.println("utcOffset::::::::::"+utcOffset);

        Date triggerTime = date;
        String onlyHoursAndMin = StringUtils.strip(utcOffset, "UTC ");

        String[] split = onlyHoursAndMin.split(":");
        int hours = Integer.parseInt("0");
        int minutes = Integer.parseInt("0");
        if (split.length == 2) {
            hours = Integer.parseInt(split[0]);
            minutes = Integer.parseInt(split[1]);
        } else if (split.length == 1) {
            hours = Integer.parseInt(split[0]);
            minutes = Integer.parseInt("0");
        }

        TimeZone timeZone = TimeZone.getTimeZone("UTC");
        Calendar calendar = Calendar.getInstance(timeZone);
        calendar.setTime(triggerTime);
        calendar.add(Calendar.HOUR_OF_DAY, hours);
        calendar.add(Calendar.MINUTE, minutes);
        Date s = calendar.getTime();
        
        SimpleDateFormat utcFormatter1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ROOT);
        String newDate = utcFormatter1.format(s);
        System.out.println("Date in string format::::::::::::::"+newDate);
        
        SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ROOT);
        SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ROOT);
        Date aaa = format1.parse(newDate);
        String bbb = format2.format(aaa);
        System.out.println(":::::::::::::"+aaa);
        System.out.println("Date in correct format::::::::::::::"+format2.format(aaa));
        
    }

但結局日期格式是 Tue Jan 10 05:51:44 IST 2023,這不是預期的。

並且在構建時我也遇到以下錯誤:Forbidden method invocation: java.util.Calendar#getInstance(java.util.TimeZone) [Uses default locale or time zone]

我建議放棄舊版 API(java.util.Date、java.util.Calendar 等),它既麻煩又容易出錯。 由於 java 8 現代日期時間 API, java.time可用。 有了它,任務將變得非常簡單。

String date = "2023-01-09T23:51:44.595Z";
OffsetDateTime oldDateTime = OffsetDateTime.parse(date);
System.out.println("old - " + oldDateTime);
ZoneOffset offset = ZoneOffset.ofHours(6);
OffsetDateTime newDateTime = oldDateTime.withOffsetSameInstant(offset);
System.out.println("new - " + newDateTime);

打印時間 - 2023-01-10T05:51:44.595+06:00

請注意,它以+06:00結尾,而不是Z 日期時間字符串末尾的Z表示Zulu ,表示時間為 UTC - 以 2014-01-01T00:00:00.588Z 等日期字符串結尾的 Z 是什么 由於結果時間是 UTC + 6 小時,因此日期字符串2023-01-10T05:51:44.595Z不正確的。

java.時間

java.util日期時間 API 及其相應的解析/格式化類型SimpleDateFormat已過時且容易出錯。 2014 年 3 月, 現代日期時間 API作為Java 8 標准庫的一部分發布,它取代了舊日期時間 API,從那時起強烈建議切換到java.time ,現代日期時間 API。

使用java.time解決方案

  1. java.time API 基於ISO 8601 ,因此您不需要DateTimeFormatter來解析已經采用 ISO 8601 格式的日期時間字符串,例如您的日期時間字符串2023-01-09T23:51:44.595Z可以被直接解析為OffsetDateTime
  2. 您的偏移字符串不是 ISO 8601 標准格式。 標准格式為+/-HH:mm:ssZ ,表示+00:00偏移量。 在大多數情況下,您會看到+/-HH:mm例如+06:00 您可以選擇任何基本的字符串操作技術來從您的字符串中獲取小時和分鍾,並使用它們創建一個ZoneOffset實例。 我使用了一個我發現很容易做到的方法。

代碼的 rest 很簡單。

演示:

import java.time.OffsetDateTime;
import java.time.ZoneOffset;

class Main {
    public static void main(String[] args) {
        String strDateTime = "2023-01-09T23:51:44.595Z";
        String utcOffset = "UTC +6";
        int offsetHour = Integer.parseInt(utcOffset.replaceAll("[^0-9+-]", ""));
        ZoneOffset zoneOffset = ZoneOffset.ofHours(offsetHour);
        OffsetDateTime odtGiven = OffsetDateTime.parse(strDateTime);
        OffsetDateTime odtDesired = odtGiven.withOffsetSameLocal(zoneOffset)
                                        .withOffsetSameInstant(zoneOffset.UTC);
        System.out.println(odtDesired);
    }
}

Output :

2023-01-09T17:51:44.595Z

請注意,如果沒有 am/pm 標記, 2023-01-10T05:51:44.595Z沒有意義,因為您的意思是05:51:44.595 pm 您可以使用DateTimeFormatter以您想要的方式格式化上述 output。

在線演示

Trail:Date Time了解有關現代日期時間 API 的更多信息。


我喜歡Ole VV 建議的替代方法來解析偏移字符串。 下面給出的是基於他的建議的解決方案:

class Main {
    public static void main(String[] args) {
        String strDateTime = "2023-01-09T23:51:44.595Z";
        String utcOffset = "UTC +6";
        DateTimeFormatter offsetFormatter = new DateTimeFormatterBuilder()
                                            .appendLiteral("UTC ")
                                            .appendOffset("+H:mm", "+0")
                                            .toFormatter(Locale.ROOT);
        ZoneOffset zoneOffset = offsetFormatter.parse(utcOffset, ZoneOffset::from);
        // Rest of the lines are the same as the above code
    }
}

在線演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM