我为自定义日历编写了代码,在其中我使用日历对象,我使用getFirstDayOfWeek()方法来检索每个月加载的每个month.On的第一天,方法"_calendar.getTime()“返回第一个日期。在每台设备上,它都在三星J7上返回J7,它将每周的起始日期返回为2。这是我的三星J7调试器日志
java.util.GregorianCalendartime=?,areFieldsSet=false,lenient=true,zone=亚洲/加尔各答,firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2016,MONTH=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,AM_PM=1,En19#,en20 20#,en21#
它说firstDayOfWeek =2,对于它显示为1的其他设备,那么对于解决方案有什么想法吗?谢谢。
发布于 2016-10-14 11:00:06
好的,我找到解决办法了。我没有使用getFirstDayOfWeek(),而是传递了1作为参数。所以它现在正常工作了。
_calendar.set(year, (month - 1), 1);代替
_calendar.set(year, (month - 1), _calendar.getFirstDayOfWeek());发布于 2017-05-10 02:45:32
tl;dr
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。
避免遗留日期-时间类
Calendar类有许多糟糕的设计决策。我认为这种对每周一天的不同定义就是其中之一。避免这些麻烦的旧日期时间类(如Calendar和Date )的原因之一是。这些类现在是遗留的,被java.time类所取代。
使用java.time
LocalDate类表示一个日期纯值,没有一天的时间,也没有时区.
时区是确定日期的关键。在任何特定时刻,全球各地的日期因地区而异。例如,午夜后几分钟在法国巴黎是一个新的一天,而仍然“昨天”在魁北克省。
以continent/region格式指定continent/region,如America/Montreal、Africa/Casablanca或Pacific/Auckland。不要使用3-4字母的缩写,如EST或IST,因为它们不是真正的时区,不标准化,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );要获得一周的第一天,(a)决定星期的第一天是什么,(b)使用TemporalAdjusters中定义的TemporalAdjusters实现来获取特定DayOfWeek枚举对象的日期。
DayOfWeek firstDow = DayOfWeek.MONDAY ;
LocalDate ld = today.with( TemporalAdjusters.previousOrSame( firstDow ) ) ;要获得一个月中某一天的LocalDate,请调用with方法并从ChronoField.DAY_OF_MONTH传递一个enum对象。
LocalDate firstOfMonth = today.with( ChronoField.DAY_OF_MONTH , 1L ) ;关于java.time
java.time框架内置到Java8和更高版本中。这些类取代了麻烦的旧遗赠日期时间类,如java.util.Date、Calendar和SimpleDateFormat。
尤达-时间项目现在在维护模式中,建议迁移到java.time类。
要了解更多信息,请参见Oracle教程。并搜索堆栈溢出以获得许多示例和解释。规范是JSR 310。
在哪里获得java.time类?
https://stackoverflow.com/questions/40041147
复制相似问题