三星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是代表星期一的硬编码常数。
  • 显然你当前的默认语言环境认为星期一是一周中的第一天。
  • 改用java.time代替。
  • 对于本周的第一天:

    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 。 例如,在北美的大部分地区,第一天通常是星期天。 在欧洲的大部分地区,本周的第一天是星期一。

    如果您未能指定LocaleCalendar类会隐式应用JVM的当前默认区域设置。 显然,在您的默认语言环境中,一周中的第一天是星期一。 我推断,因为你报告数字2 。 如果你探索int常量Calendar.MONDAY ,你会发现它确实是一个值为2的原始int

    避免遗留的日期时间类

    Calendar类有许多糟糕的设计决定。 我认为这种不同的星期几定义就是其中之一。 避免这些令人讨厌的旧日期时间课程(如CalendarDate的许多原因之一。 这些类现在是遗留的,由java.time类代替。

    使用java.time

    LocalDate类表示没有时间和不带时区的仅限日期的值。

    时区对确定日期至关重要。 对于任何特定的时刻,日期因地区而异。 例如,巴黎午夜过后的几分钟,法国是一个新的一天,而在魁北克蒙特利尔仍然是“昨天”。

    continent/region格式指定适当的时区名称,例如America/MontrealAfrica/CasablancaPacific/Auckland 。 切勿使用3-4字母缩写(如ESTIST因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

    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.DateCalendarSimpleDateFormat等麻烦的旧式遗留日期时间类。

    现在处于维护模式的Joda-Time项目建议迁移到java.time类。

    要了解更多信息,请参阅Oracle教程。 并搜索堆栈溢出了很多例子和解释。 规范是JSR 310。

    何处获取java.time类?

  • Java SE 8Java SE 9和更高版本
  • 内置。
  • 带有捆绑实现的标准Java API的一部分。
  • Java 9增加了一些次要功能和修复。
  • Java SE 6Java SE 7
  • 大部分java.time功能都在ThreeTen-Backport中移植到Java 6和7。
  • Android的
  • ThreeTenABP项目专门针对Android采用了ThreeTen-Backport(上文提到)。
  • 请参阅如何使用ThreeTenABP ...。
  • 链接地址: http://www.djcxy.com/p/18705.html

    上一篇: Samsung J7 returning first day of week as 2

    下一篇: Compare GregorianCalendar time with current time