gpt4 book ai didi

java - 使用 ZonedDateTime 和日历 API 计算年度周问题

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:53:28 24 4
gpt4 key购买 nike

我试图根据 ISO-8601 日期格式字符串输入计算一年中的星期几。最初我尝试使用 java.time.ZonedDateTime 进行此操作,但它为输入日期 - 2-Jan-2049 提供了不正确的结果。然后我尝试使用 Calendar API,它也给出了 2049 年 12 月 31 日的错误响应。

我附上了示例测试代码

public class ZonedDateTimeTest {        
public static void main(String[] args) throws InterruptedException {
System.out.println("======================================");
String instantStr1 = "2049-01-02T03:48:00Z";
printYearAndWeekOfYear(instantStr1);
System.out.println("======================================");
String instantStr2 = "2049-12-31T03:48:00Z";
printYearAndWeekOfYear(instantStr2);
System.out.println("======================================");
}

public static void printYearAndWeekOfYear(String ISODate) {
System.out.println("Date provided -> " + ISODate);

ZonedDateTime utcTimestamp = parseToInstant(ISODate).atZone(ZoneOffset.UTC);
int year = utcTimestamp.getYear();
int weekOfYear = utcTimestamp.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR);
System.out.println("Using ZonedDateTime API:: Year " + year + " weekOfYear " + weekOfYear);


Date d1 = Date.from(parseToInstant(ISODate));
Calendar cl = Calendar.getInstance();
cl.setTime(d1);
int year1 = cl.get(Calendar.YEAR);
int weekOfYear1 = cl.get(Calendar.WEEK_OF_YEAR);
System.out.println("Using Calendar API:: Year " + year1 + " weekOfYear " + weekOfYear1);
}

public static Instant parseToInstant(String ISODate) {
return DateTimeFormatter.ISO_OFFSET_DATE_TIME.parse(ISODate, Instant::from);
}
}

上面代码的输出

======================================
Date provided 2049-01-02T03:48:00Z
Using ZonedDateTime API: Year 2049 weekOfYear 53
Using Calendar API: Year 2049 weekOfYear 1
======================================
Date provided 2049-12-31T03:48:00Z
Using ZonedDateTime API: Year 2049 weekOfYear 52
Using Calendar API: Year 2049 weekOfYear 1
======================================

最佳答案

一开始您的代码有四个问题:

  • 当您使用 Calendar 时,您使用的是系统默认时区,这很可能会改变 Instant 所在的日期。如果您将日历设置为使用 UTC,您将使其更加一致。
  • 您使用的是Calendar.YEAR,它将为您提供日历 年而不是 年。您需要改用 Calendar.getWeekYear()
  • 您正在使用 ZonedDateTime.getYear(),这又是日历年。你应该使用 utcTimestamp.get(IsoFields.WEEK_BASED_YEAR)
  • 您正在使用 Calendar.getInstance(),它可能会为您提供一个非公历,或者它可能为您要执行的计算设置了不合适的星期几

解决这些问题(和命名约定)我们最终得到:

import java.util.*;
import java.time.*;
import java.time.format.*;
import java.time.chrono.*;
import java.time.temporal.*;

public class ZonedDateTimeTest {

public static void main(String[] args) {
printYearAndWeekOfYear("2049-01-02T03:48:00Z");
String instantStr2 = "2049-12-31T03:48:00Z";
printYearAndWeekOfYear("2049-12-31T03:48:00Z");
}

public static void printYearAndWeekOfYear(String isoDate) {
System.out.println("Date provided -> " + isoDate);

Instant instant = DateTimeFormatter.ISO_OFFSET_DATE_TIME.parse(isoDate, Instant::from);
ZonedDateTime utcTimestamp = instant.atZone(ZoneOffset.UTC);
int year = utcTimestamp.get(IsoFields.WEEK_BASED_YEAR);
int weekOfYear = utcTimestamp.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR);
System.out.println("ZonedDateTime: Year " + year + " weekOfYear " + weekOfYear);

// Force the Gregorian calendar with ISO rules and using UTC
Calendar calendar = new GregorianCalendar();
calendar.setFirstDayOfWeek(Calendar.MONDAY);
calendar.setMinimalDaysInFirstWeek(4);
calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
calendar.setTime(Date.from(instant));

int calYear = calendar.getWeekYear();
int calWeekOfYear = calendar.get(Calendar.WEEK_OF_YEAR);
System.out.println("Calendar: Year " + calYear + " weekOfYear " + calWeekOfYear);
System.out.println();
}
}

输出:

Date provided -> 2049-01-02T03:48:00Z
ZonedDateTime: Year 2048 weekOfYear 53
Calendar: Year 2048 weekOfYear 53

Date provided -> 2049-12-31T03:48:00Z
ZonedDateTime: Year 2049 weekOfYear 52
Calendar: Year 2049 weekOfYear 52

我觉得这两个都不错。

关于java - 使用 ZonedDateTime 和日历 API 计算年度周问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41673485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com