三星J7作为2的第一天返回

时间:2016-10-14 10:38:21

标签: android calendar

我已经编写了自定义日历的代码,我正在使用日历对象。我使用方法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.那么解决方案的任何想法? 感谢。

2 个答案:

答案 0 :(得分:0)

好的,我得到了解决方案。我没有使用getFirstDayOfWeek()作为参数传递1。所以它现在正常运作。

d.strftime

取代

 _calendar.set(year, (month - 1), 1);

答案 1 :(得分:0)

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

如果未指定Locale,则Calendar类将隐式应用JVM的当前默认语言环境。显然,在您的默认语言环境中,一周的第一天是星期一。我推断这是因为您报告了数字2。如果您浏览int常量Calendar.MONDAY,则会找到it is indeed a primitive int of value 2

避免遗留日期时间类

Calendar类有许多糟糕的设计决策。我认为这种不同的星期几定义是其中之一。避免这些麻烦的旧日期时间类的许多原因之一,例如CalendarDate。这些类现在已经遗留下来,取而代之的是java.time类。

使用java.time

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

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的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.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?