Java日历错误
我对Java中的日历有一些问题。当我在日历中添加周数时,在某些情况下它不能正常工作。例如,将第周设置为3,然后添加-3周;)在大多数情况下效果良好,但在2010年、2016年等年份中效果不佳(今年是一年后的53周)。这看起来像是JDK中的错误,我认为当周数为52:D时,它们会改变年份一些简单的代码: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
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是包含日历年第一个星期四的一周李>
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(如上所述)
- 看
- 星期一到星期天
- 周#1是包含日历年第一个星期四的一周李>