Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java日历错误_Java_Calendar - Fatal编程技术网

Java日历错误

Java日历错误,java,calendar,Java,Calendar,我对Java中的日历有一些问题。当我在日历中添加周数时,在某些情况下它不能正常工作。例如,将第周设置为3,然后添加-3周;)在大多数情况下效果良好,但在2010年、2016年等年份中效果不佳(今年是一年后的53周)。这看起来像是JDK中的错误,我认为当周数为52:D时,它们会改变年份一些简单的代码: Calendar calendar = new GregorianCalendar(); calendar.set(Calendar.YEAR, 2016); calendar.set(Calend

我对Java中的日历有一些问题。当我在日历中添加周数时,在某些情况下它不能正常工作。例如,将第周设置为3,然后添加-3周;)在大多数情况下效果良好,但在2010年、2016年等年份中效果不佳(今年是一年后的53周)。这看起来像是JDK中的错误,我认为当周数为52:D时,它们会改变年份一些简单的代码:

Calendar calendar = new GregorianCalendar();
calendar.set(Calendar.YEAR, 2016);
calendar.set(Calendar.WEEK_OF_YEAR, 3);
calendar.add(Calendar.WEEK_OF_YEAR, -3);
System.out.println("rolled week: " + calendar.get(Calendar.WEEK_OF_YEAR) + " - " + calendar.get(Calendar.YEAR));
该代码的结果是:滚动周:53-2016:D

在所有其他情况下,应为53-2015,并按其应有的方式运行


有人有类似的问题吗?

问题是你显示的是年份,而不是年份。您不需要对日历进行算术运算就可以显示这一点。基本上你展示的是2016年1月1日。这一年是2016年,但周年(即计算年周的年份)是2015年

不幸的是,据我所知,Java没有一种获取周-年的方法。您最好使用,它可以让您轻松完成所有这些:

import org.joda.time.*;

public class Test {
    public static void main(String[] args) throws Exception {
        LocalDate date = new LocalDate(2016, 1, 1);
        System.out.println(date);
        System.out.println(date.getWeekOfWeekyear());
        System.out.println(date.getWeekyear());
    }    
}
输出:

2016-01-01
53
2015

问题是,您显示的是年份,而不是年份的周数。您不需要对日历进行算术运算就可以显示这一点。基本上你展示的是2016年1月1日。这一年是2016年,但周年(即计算年周的年份)是2015年

不幸的是,据我所知,Java没有一种获取周-年的方法。您最好使用,它可以让您轻松完成所有这些:

import org.joda.time.*;

public class Test {
    public static void main(String[] args) throws Exception {
        LocalDate date = new LocalDate(2016, 1, 1);
        System.out.println(date);
        System.out.println(date.getWeekOfWeekyear());
        System.out.println(date.getWeekyear());
    }    
}
输出:

2016-01-01
53
2015

乔恩,你说得对。今天我注意到问题出在哪里,这正是你所说的。我只对周数和年感兴趣,所以在将周数添加到周数之前,我将周数设置为周一。对我来说这很有效

Calendar calendar = new GregorianCalendar();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.WEEK_OF_YEAR, week);
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
calendar.add(Calendar.WEEK_OF_YEAR, -51);

乔恩,你说得对。今天我注意到问题出在哪里,这正是你所说的。我只对周数和年感兴趣,所以在将周数添加到周数之前,我将周数设置为周一。对我来说这很有效

Calendar calendar = new GregorianCalendar();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.WEEK_OF_YEAR, week);
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
calendar.add(Calendar.WEEK_OF_YEAR, -51);
这是正确的,应该被接受。你把一年中的一周与日历年和基于周的一年混淆了

周基年 如果我们谈论的是标准ISO 8601对一周的定义,这意味着:

  • 星期一到星期天
  • 周#1是包含日历年第一个星期四的一周
假设第一个星期四是1月2日,这意味着前一天的星期三是1日,前一个星期一和星期二是前一日历年的最后几天,但在下一个基于星期的年份中。因此,您不能将日历年数字与基于周的年份数字混淆

避免遗留日期时间类 此外,您正在使用一些麻烦的旧日期时间类,例如
Calendar
,这些类现在是遗留的,被java.time类取代

LocalDate
首先获取当前日期。该类表示一个仅限日期的值,不包含一天中的时间和时区

时区对于确定日期至关重要。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,中午夜后几分钟是新的一天,而中仍然是“昨天”

大陆/地区
的格式指定,例如,或
太平洋/奥克兰
。切勿使用3-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

IsoFields
使用类获取数字。并获取基于周的日历的年数

int weekNumber = today.get( IsoFields.WEEK_OF_WEEK_BASED_YEAR );
int yearNumberOfWeekBasedYear = today.get( IsoFields.WEEK_BASED_YEAR );  // Around end/beginning of year, may be different than calendar-year number.
让我们再举一个具体的例子,2017年的第一天。请注意,它的日历年当然是2017年,但因为它是在星期日登陆的,所以它是2016年(不是2017年)的最后一周(#52)

转储到控制台

System.out.println ( "firstOf2017.toString(): " + firstOf2017 );
System.out.println ( "firstOf2017DayOfWeek.toString(): " + firstOf2017DayOfWeek );
System.out.println ( "weekNumber: " + weekNumber );
System.out.println ( "yearNumberOfWeekBasedYear: " + yearNumberOfWeekBasedYear );
System.out.println ( "yearNumberOfCalendarYear: " + yearNumberOfCalendarYear );
2017年1月1日。toString():2017-01-01

2017年第一个星期天。toString():星期日

周数:52

周数Basedyear:2016

日历年数:2017年

数学周 您可以使用
LocalDate
类减去周数

LocalDate ld = firstOf2017.minusWeeks( 3 );
YearWeek
您可能希望将库添加到项目中以访问该类

通过指定枚举对象获取该周的某一天

LocalDate ld = yearWeek.atDay( DayOfWeek.MONDAY );
2016-01-18

再加上三周

LocalDate threeWeeksLater = ld.plusWeeks( 3 );
2016-02-08

获取新日期的周数

YearWeek yearWeek2 = YearWeek.from( threeWeeksLater );
int weekNumber = yearWeek2.getWeek();
int yearNumberOfWeekBasedYear = yearWeek2.getYear();
生成标准ISO 8601字符串表示形式

String output = yearWeek2.toString();
2016-2006年


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • 后来
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门为Android采用了ThreeTen Backport(如上所述)
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、、和。

是正确的,应该接受。你把一年中的一周与日历年和基于周的一年混淆了

周基年 如果我们谈论的是标准ISO 8601对一周的定义,这意味着:

  • 星期一到星期天
  • 周#1是包含日历年第一个星期四的一周
假设第一个星期四是1月2日,这意味着前一天的星期三是1日,前一个星期一和星期二是前一日历年的最后几天,但在下一个基于星期的年份中。所以你不能把卡琳达搞混