三星J7返回第一天为2
我为自定义日历写了一个代码,用于使用日历对象。我使用getFirstDayOfWeek()方法检索每个月的第一天。每月加载方法“_calendar.getTime()”返回第一个日期。 在每台设备上,它都能正确返回。但在三星J7上,它返回的开始日期为2。 这是我的三星J7调试器日志
java.util.GregorianCalendar中[时间= ?, areFieldsSet =假,宽大=真,区=亚/加尔各答,Firstdayofweek可= 2,minimalDaysInFirstWeek = 4,ERA = 1,YEAR = 2016,月= 10,WEEK_OF_YEAR = 41,WEEK_OF_MONTH = 3,DAY_OF_MONTH = 14,DAY_OF_YEAR = 288,DAY_OF_WEEK = 6,DAY_OF_WEEK_IN_MONTH = 2,AM_PM = 1,HOUR = 3,HOUR_OF_DAY = 15,MINUTE = 46,SECOND = 58,微差= 199,ZONE_OFFSET = 19800000,DST_OFFSET = 0]
它说firstDayOfWeek = 2,其余设备显示为1.那么对于解决方案的任何想法? 谢谢。
好的,我得到了解决方案。 而不是使用getFirstDayOfWeek()我传递1作为参数。 所以现在它的工作正常。
_calendar.set(year, (month - 1), 1);
代替
_calendar.set(year, (month - 1), _calendar.getFirstDayOfWeek());
TL;博士
2
是代表星期一的硬编码常数。 对于本周的第一天:
LocalDate.now( ZoneId.of( "America/Montreal" ) )
.with( TemporalAdjusters.previousOrSame( DayOfWeek.MONDAY ) )
对于本月的第一天:
LocalDate.now( ZoneId.of( "Pacific/Auckland" ) )
.with( ChronoField.DAY_OF_MONTH , 1L )
细节
getFirstDayOfWeek()检索每个月的第一天
你似乎在本周的第一个月和第一个月中感到困惑。
当然,这个月的第一个总是1
。
第一个星期是星期几,如周日或周一等一周的第一天的定义Calendar
类而异,这取决于Locale
。 例如,在北美的大部分地区,第一天通常是星期天。 在欧洲的大部分地区,本周的第一天是星期一。
如果您未能指定Locale
, Calendar
类会隐式应用JVM的当前默认区域设置。 显然,在您的默认语言环境中,一周中的第一天是星期一。 我推断,因为你报告数字2
。 如果你探索int
常量Calendar.MONDAY
,你会发现它确实是一个值为2
的原始int
。
避免遗留的日期时间类
Calendar
类有许多糟糕的设计决定。 我认为这种不同的星期几定义就是其中之一。 避免这些令人讨厌的旧日期时间课程(如Calendar
和Date
的许多原因之一。 这些类现在是遗留的,由java.time类代替。
使用java.time
LocalDate
类表示没有时间和不带时区的仅限日期的值。
时区对确定日期至关重要。 对于任何特定的时刻,日期因地区而异。 例如,巴黎午夜过后的几分钟,法国是一个新的一天,而在魁北克蒙特利尔仍然是“昨天”。
以continent/region
格式指定适当的时区名称,例如America/Montreal
, Africa/Casablanca
或Pacific/Auckland
。 切勿使用3-4字母缩写(如EST
或IST
因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
要获得一周的第一天,(一)决定什么是一周给你的第一天,(B)使用TemporalAdjuster
定义实现TemporalAdjusters
以获取特定日期DayOfWeek
枚举对象。
DayOfWeek firstDow = DayOfWeek.MONDAY ;
LocalDate ld = today.with( TemporalAdjusters.previousOrSame( firstDow ) ) ;
要在一个月的某天获取LocalDate
,请调用with
方法并从ChronoField.DAY_OF_MONTH
传递一个枚举对象。
LocalDate firstOfMonth = today.with( ChronoField.DAY_OF_MONTH , 1L ) ;
关于java.time
java.time框架内置于Java 8及更高版本中。 这些类取代了诸如java.util.Date
, Calendar
和SimpleDateFormat
等麻烦的旧式遗留日期时间类。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程。 并搜索堆栈溢出了很多例子和解释。 规范是JSR 310。
何处获取java.time类?