java 日期转换:将UTCO偏移添加到现有时区

beq87vna  于 2023-02-02  发布在  Java
关注(0)|答案(2)|浏览(105)

我的日期格式为(例如)日期= 2023 - 01 - 09T23:51:44.595Z,我的utcOffset字符串utcOffset ="UTC +6"
我希望以日期格式输出为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));
        
    }

但结局日期格式为2023年1月10日星期二05:51:44 IST,这不是预期的。
当构建时,我也得到以下错误:禁止的方法调用:java. util. Calendar #getInstance(java. util. TimeZone)[使用默认区域设置或时区]

qni6mghb

qni6mghb1#

我建议不要使用传统的API(java.util.Date,java.util.Calendar等),因为它既麻烦又容易出错。自从java8以来,现代的日期-时间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 -What is the Z ending on date strings like 2014-01-01T00:00:00.588Z。由于结果时间是UTC + 6小时,因此日期字符串2023-01-10T05:51:44.595Z将是不正确的

3okqufwl

3okqufwl2#

Java.时间

java.util日期-时间API及其对应的解析/格式化类型SimpleDateFormat已经过时且容易出错。2014年3月,modern Date-Time 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
    1.您的偏移字符串不是ISO 8601标准格式。标准格式为+/-HH:mm:ssZ,表示+00:00偏移。在大多数情况下,您将看到+/-HH:mm,例如+06:00。您可以选择任何基本的字符串操作技术来从字符串中获取小时和分钟,并使用它们创建一个ZoneOffset示例。我用了一个我觉得很容易做的方法。
    代码的其余部分很简单。
    • 演示:**
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);
    }
}
    • 输出**:
2023-01-09T17:51:44.595Z

请注意,如果没有am/pm标记,2023-01-10T05:51:44.595Z就没有意义,因为您指的是05:51:44.595 pm。您可以使用DateTimeFormatter以您想要的方式格式化上述输出。
ONLINE DEMO
从**Trail: Date Time**了解有关现代日期-时间API的更多信息。
我喜欢Ole V.V.建议的解析偏移字符串的替代方法。下面给出的是基于他的建议的解决方案:

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
    }
}

ONLINE DEMO

相关问题