open jdk 11 中不推荐使用 new Date() 吗?或不支持

Siy*_*eka 1 java date

我本周在日期库方面遇到问题。当你用谷歌搜索时,已经是第 11 周,但我的函数返回 12。就位置而言,我在南非,但正在测试该应用程序的德国人报告了同样的问题。我编写了下面的代码,用一小段代码对此进行了测试,我发现当我使用 new Date() 库获取日历时,它返回 12,但是当我使用 Localdate.now() 时,它返回 11。

我更新了 Dockerfile jdk 最初是jdk8,现在是openjdk11。这可能是我得到不同结果的原因吗?new Date()Java 11 不再支持?

下面是代码片段。如果有人能在这方面帮助我,我会很高兴。

package com.company;

import java.time.LocalDate;
import java.time.temporal.ChronoField;
import java.util.Calendar;
import java.util.Date;

public class CalenderLibrary {
    private static Calendar cal = Calendar.getInstance();

    public static void main(String[] args) {
        Date date = new Date();
        String calendarWeekFromEvent = getCalendarWeekFromEventWithDate(date);
        System.out.println("Date: {} " + calendarWeekFromEvent);

        LocalDate localDate = LocalDate.now();
        String localDate1 = getCalendarWeekFromEventWithLocalDate(localDate);
        System.out.println("LocalDate: {} " + localDate1);


    }

    private static String getCalendarWeekFromEventWithLocalDate(LocalDate date) {
        return String.valueOf(date.get(ChronoField.ALIGNED_WEEK_OF_YEAR));
    }

    private static String getCalendarWeekFromEventWithDate(Date date) {
        cal.setTime(date);
        return String.valueOf(cal.get(Calendar.WEEK_OF_YEAR));
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:

Date: {} 12

LocalDate: {} 11
Run Code Online (Sandbox Code Playgroud)

Sto*_*ica 6

java.util.Datejava.util.Calendar没有被弃用,并且仍然像往常一样工作。然而,它们的工作方式很难使用,这就是为什么java.time建议使用类。

WEEK_OF_YEAR您所看到的是(取决于区域设置)和ALIGNED_WEEK_OF_YEAR(在所有区域设置中都相同)之间的差异。

设置或获取WEEK_OF_MONTHWEEK_OF_YEAR字段时,Calendar必须确定该月或该年的第一周作为参考点。一个月或一年的第一周定义为从该月或一年开始getFirstDayOfWeek()并至少包含getMinimalDaysInFirstWeek()该月或一年的天数的最早 7 天时间段。编号为 ..., -1, 0 的周在第一周之前;接下来是第 2、3、... 周。请注意,返回的标准化编号get()可能不同。例如,特定的日历子类可以将一年的第 1 周之前的一周指定为前一年的第 n 周。


ALIGNED_WEEK_OF_YEAR表示一年中周数的概念,其中周数与年初对齐。该字段通常与 一起使用ALIGNED_DAY_OF_WEEK_IN_YEAR

例如,在每周 7 天的日历系统中,一年中的第一个对齐周从年份 1 开始,第二个对齐周从年份 8 开始,依此类推。因此,一年中的某一天值 1 到 7 位于对齐的第 1 周中,而一年中的某一天值 8 到 14 位于对齐的第 2 周中,依此类推。


对于区域设置差异:

// returns DayOfWeek.MONDAY
WeekFields.of(Locale.forLanguageTag("de-DE")).getFirstDayOfWeek();

// returns DayOfWeek.SUNDAY
WeekFields.of(Locale.forLanguageTag("en-ZA")).getFirstDayOfWeek();
Run Code Online (Sandbox Code Playgroud)

要使用本地当前系统获取一年中未对齐的周java.time

LocalDate.now().get(WeekFields.of(Locale.getDefault()).weekOfYear())
Run Code Online (Sandbox Code Playgroud)

如果您想要与区域设置无关,那么ISO.weekOfYear()您希望一周从星期一开始,然后SUNDAY_START.weekOfYear()从星期日开始。