我已经编写了自定义日历的代码,我正在使用日历对象。我使用方法getFirstDayOfWeek()来检索每个月的第一天。每月加载方法“_calendar.getTime()”返回第一个日期。在每台设备上它都正确返回。但是在三星J7上,它将周的开始日期返回为2。这是我对samsung 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.那么解决方案的任何想法? 感谢。
答案 0 :(得分:0)
好的,我得到了解决方案。我没有使用getFirstDayOfWeek()作为参数传递1。所以它现在正常运作。
d.strftime
取代
_calendar.set(year, (month - 1), 1);
答案 1 :(得分:0)
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
,则会找到it is indeed a primitive int
of value 2
。
Calendar
类有许多糟糕的设计决策。我认为这种不同的星期几定义是其中之一。避免这些麻烦的旧日期时间类的许多原因之一,例如Calendar
和Date
。这些类现在已经遗留下来,取而代之的是java.time类。
LocalDate
类表示没有时间且没有时区的仅限日期的值。
时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。
以continent/region
的格式指定proper time zone name,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用诸如EST
或IST
之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
要获得一周的第一天,(a)决定一周的第一天是什么时候,(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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?