首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用YYYY的日期

使用YYYY的日期
EN

Stack Overflow用户
提问于 2018-01-10 07:40:41
回答 2查看 249关注 0票数 1

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

我理解使用YYYY代替YYYY的问题,YYYY指的是日历年而不是实际的年份,如果日期落在一月历年的第一周,就会导致年数错误。

我试着进一步阅读并理解

year

上面写着

“一周年与WEEK_OF_YEAR周期同步。从第一周到最后一周(包括在内)的所有周都有相同的周年值。因此,一周的第一天和最后一天可能有不同的日历年值。。”

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

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

代码语言:javascript
复制
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

因此,2016年1月1日是2016年的第一周,而不是2015年的第53周。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-10 08:54:52

为了给出一个具体的答案,下表显示了从2010年到2020年每年的1月1日,以及ISO (国际标准)和美国的一周、一周和一年的数字。

代码语言:javascript
复制
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周。

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

美国规则:第一周是包含1月1日的一周,1月1日总是在它自己的年份的第一周,按照这个定义(周从星期日开始)。

这张桌子是从这个片段里出来的:

代码语言:javascript
复制
    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和time。我热烈推荐它,而不是过时的CalendarSimpleDateFormatDate

票数 1
EN

Stack Overflow用户

发布于 2018-01-10 07:56:24

不是的。周年只能与周一起使用。例如,2016年1月1日(一个星期五)是在53。2015年周。它永远不会显示为2015年1月1日,因为这将是模棱两可的。

代码语言:javascript
复制
Calendar d = Calendar.getInstance();
d.set(Calendar.YEAR, 2016)
d.set(Calendar.MONTH, Calendar.JANUARY);
d.set(Calendar.DATE, 1);

SimpleDateFormat ft = new SimpleDateFormat("w-YYYY");
ft.format(d.getTime()); 
// => "53-2015"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48182460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档