Java 日历设置周的第天不在当前周内

Java 日历设置周的第天不在当前周内,java,calendar,Java,Calendar,我有以下代码: Calendar current = GregorianCalendar.getInstance(Locale.getDefault()); current.setFirstDayOfWeek(Calendar.MONDAY); current.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY); 今天是12月6日,星期五。当我运行它时,我希望当前一周应该是12月2日星期一->12月8日星期日,current现在应该设置为12月8日。然而,它被

我有以下代码:

Calendar current = GregorianCalendar.getInstance(Locale.getDefault());
current.setFirstDayOfWeek(Calendar.MONDAY);
current.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);

今天是12月6日,星期五。当我运行它时,我希望当前一周应该是12月2日星期一->12月8日星期日,
current
现在应该设置为12月8日。然而,它被设定为12月1日。这不是破坏了我所做的
setFirstDayOfWeek
调用吗?

解决方法(当然)已经使用了。这对我来说很有效,因为JodaTime假设周从周一开始。不幸的是,没有办法改变JodaTime视为一周中第一天的日期

    DateTime dt = new DateTime();
    dt = dt.withDayOfWeek(DateTimeConstants.SUNDAY);
    Calendar current = dt.toGregorianCalendar();
tl;博士 java.time 您正在使用非常麻烦的旧
Calendar
类,该类现在已经过时,被java.time类取代

LocalDate
该类表示一个仅限日期的值,不包含一天中的时间和时区

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

如果未指定时区,JVM将隐式应用其当前默认时区。该默认值可能随时更改,因此您的结果可能会有所不同。最好将所需/预期时区明确指定为参数

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

如果要使用JVM的当前默认时区,请请求它并将其作为参数传递。如果省略,则隐式应用JVM的当前默认值。最好是显式的,因为JVM中任何应用程序的任何线程中的任何代码都可能在运行时的任何时刻更改默认值

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.
或者指定一个日期。你可以用一个数字来设置月份,1-12月的数字为1-12

LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.
或者,最好使用预定义的枚举对象,一年中每个月一个。提示:在整个代码库中使用这些
Month
对象,而不仅仅是一个整数,这样可以使代码更加自我记录,确保有效值,并提供更高的可用性

星期几 可以将星期几表示为
DayOfWeek
enum对象

DayOfWeek dow = ld.getDayOfWeek() ;
若要移动到另一个日期,请使用类中的实现

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

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

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

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android,该项目采用了ThreeTen Backport(如上所述)。看

该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、、和。

据我所知,没有任何文档表明,当您设置周中的某一天时,它将保持在同一周内。“你有一些你正在考虑的文件吗?”JonSkeet我解释说,它会。不幸的是,该答案中指向文档的链接已断开,因此,我无法验证它是否正确。@在我看来,调用
setFirstDayOfWeek
应该会导致
Calendar
在计算时将其视为一周的第一天。这个答案是关于设置年中的周或月中的周-您没有设置这两个字段中的任何一个。@Jonsket其他答案也包括在内请说明周中的第天的相同情况。仅供参考,项目现在已经开始,团队建议迁移到课程中。请参阅。谢谢您的详细来信。这是四年多以前的事了,所以我很高兴Java终于找到了一个更好的处理时间的系统。
LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.
LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;
DayOfWeek dow = ld.getDayOfWeek() ;
LocalDate nextOrSameMonday = ld.with( TemporalAdjusters.nextOrSame( DayOfWeek.MONDAY ) ) ;