java - 使用 'YYYY' 的日期

标签 java date calendar

这是一个与Java Date year calculation is off by year for two days相关的问题

我知道问题是由于使用“YYYY”而不是“yyyy”而出现的,其中“YYYY”指的是日历年而不是实际年份,如果日期落在 1 月日历的第一周,则会导致年份错误年。

我试图进一步阅读并理解

中的问题

https://docs.oracle.com/javase/9/docs/api/java/util/GregorianCalendar.html#week_year

它说

“一周年与 WEEK_OF_YEAR 周期同步。第一周和最后一周(含)之间的所有周具有相同的周年值。因此,一周年的第一天和最后一天可能具有不同的日历年值。"

我一直在尝试查看一年中是否有任何时间 01-Jan-XXXX 实际上显示为 01-Jan-(XXXX-1),但未能找到任何时间。有没有可能发生这种情况?

我做了一些简单的事情来获取字符串日期并使用 YYYYMMdd 格式打印出来

public static void main(String[] args) throws ParseException
{
    Calendar testCalendar = Calendar.getInstance();
    System.out.println("First day of the week: " + testCalendar.getFirstDayOfWeek());
    System.out.println("Minimal Days in First Week: " + testCalendar.getMinimalDaysInFirstWeek());
    SimpleDateFormat YYYYMMdd= new SimpleDateFormat("YYYYMMdd");
    String dateString = "01/01/2016";
    Date date = new Date();
    date = new SimpleDateFormat("dd/MM/yyyy").parse(dateString);
    testCalendar.setTime(date);
    int week = testCalendar.get(Calendar.WEEK_OF_YEAR);
    String date2 = YYYYMMdd.format(date);
    System.out.println("Week Number: " + week);
    System.out.println("Date: " + date2);

}

输出是

一周的第一天:1

第一周最少天数:1

周数:1

日期:20161231

如果我将日期更改为“01/01/2016”

输出是

一周的第一天:1

第一周最少天数:1

周数:1

日期:20160101

所以 01/01/2016 是 2016 年的第一周,而不是 2015 年的第 53 周。

最佳答案

对于具体答案,下表显示了从 2010 年到 2020 年每年的 1 月 1 日,以及 ISO(国际标准)和美国的星期几、基于周的年份和周数。

Year  DOW  ISO      US
2010  Fri  2009-53  2010-01
2011  Sat  2010-52  2011-01
2012  Sun  2011-52  2012-01
2013  Tue  2013-01  2013-01
2014  Wed  2014-01  2014-01
2015  Thu  2015-01  2015-01
2016  Fri  2015-53  2016-01
2017  Sun  2016-52  2017-01
2018  Mon  2018-01  2018-01
2019  Tue  2019-01  2019-01
2020  Wed  2020-01  2020-01

如您所见,国际上的 1 月 1 日通常在前一年的第 52 或 53 周,而在美国则总是在当年的第 1 周。

国际规则:第 1 周是包含新年至少 4 天的第一周。换句话说,一周属于一年中大部分日子所在的地方。换句话说,第 1 周是一年中的第一个星期四(因为周从星期一开始)。这意味着当 1 月 1 日是星期五、星期六或星期日时,它属于上一年的最后一周。

美国规则:第 1 周是包含 1 月 1 日的那一周。根据此定义,1 月 1 日总是落在其所在年份的第 1 周(周从星期日开始)。

表格来自这个片段:

    System.out.println("Year  DOW  ISO      US");
    for (int year = 2010; year <= 2020; year++) {
        LocalDate jan1 = LocalDate.of(year, Month.JANUARY   , 1);
        System.out.format(Locale.ROOT, "%4d  %3s  %4d-%02d  %4d-%02d%n",
                year, jan1.getDayOfWeek().getDisplayName(TextStyle.SHORT_STANDALONE, Locale.ROOT), 
                jan1.get(WeekFields.ISO.weekBasedYear()), jan1.get(WeekFields.ISO.weekOfWeekBasedYear()), 
                jan1.get(WeekFields.SUNDAY_START.weekBasedYear()), jan1.get(WeekFields.SUNDAY_START.weekOfWeekBasedYear()));
    }

我当然在使用 java.time ,现代 Java 日期和时间 API。我热烈推荐过时的 Calendar , SimpleDateFormatDate .

关于java - 使用 'YYYY' 的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48182460/

相关文章:

vb.net - .NET 日期变量规范和区域设置

java - 如何验证字符串是否为 YYYYMMDD 格式?

java - 如何在特定日期之前到达

android - 从 WebView 添加日历事件

java - 阻止 Android Studio 自动导入 java.sql.Date

java - 在 Java 中对泛型列表进行排序?

maven - UmlGraph 没有自动集成到 JavaDoc 中

无法解析 java.time.format.DateTimeParseException 从 Java 8 迁移到 Java 11

calendar - 如何创建每月 30 天的银行日历

java - CSV 文件,二进制格式更快?最快的搜索?