Android日历中的周数错误
在某些设备获得第53周,但在其他一些设备中获得第1周的年终
Calendar calender = Calendar.getInstance(); int week = calender.get(Calendar.WEEK_OF_YEAR);
答案 0 :(得分:1)
第一周
日历使用两天定义七天特定于语言区域的 参数:一周的第一天和第一天的最小天数 一周(从1到7)。这些数字取自语言环境资源 构建日历时的数据。它们也可能被指定 明确地通过设置其值的方法。
设置或获取WEEK_OF_MONTH或WEEK_OF_YEAR字段时,日历必须将月份或年份的第一周确定为 参照点。 一个月或一年的第一周被定义为 最早的七天时间从getFirstDayOfWeek()开始 至少包含该月的getMinimalDaysInFirstWeek()天或 年即可。周数在第一周之前编号为......,-1,0;周数 2,3,......跟着它。请注意,返回的规范化编号 get()可能不同。例如,特定的Calendar子类可以 将前一周的第1周指定为前一周的第n周 年。
来自Java文档(https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html)
答案 1 :(得分:0)
LocalDate.of( 2018 , Month.DECEMBER , 31 )
.get( IsoFields.WEEK_OF_WEEK_BASED_YEAR )
1
不确定您问题的直接答案,但可能会有不同的Locale
值。在Calendar
中,一周的定义因地区而异。
但是这是没有意义的。您应该使用替换Calendar
类的 java.time 类。
Calendar
是现在遗留下来的麻烦的旧日期时间类的一部分,取而代之的是 java.time 类。对于早期的Android,请参阅下面的最后一个项目符号。
您必须按周编号定义您的意思。有不同的方法来定义周和周数。
默认情况下,java.time类使用标准ISO 8601 definition:第1周具有日历年的第一个星期四,并且从星期一开始(如您所要求的那样)。所以这些年有52周或53周。该日历年的第一天和最后几天可能会在之前/之后的一周内落地。
LocalDate
类表示没有时间且没有时区的仅限日期的值。
LocalDate ld = LocalDate.of( 2012 , Month.AUGUST , 7 ) ;
询问标准周数。您可以要求提供以下TemporalField
个对象:IsoFields.WEEK_BASED_YEAR
& IsoFields.WEEK_OF_WEEK_BASED_YEAR
int weekOfWeekBasedYear = ld.get( IsoFields.WEEK_OF_WEEK_BASED_YEAR ) ;
int yearOfWeekBasedYear = ld.get( IsoFields.WEEK_BASED_YEAR ) ;
使用标准ISO 8601 format of YYYY-Www-D
转储到控制台。
String isoOutput = yearOfWeekBasedYear + "-W" + String.format("%02d", weekOfWeekBasedYear) + "-" + dayOfWeekNumber ;
System.out.println( ld + " is ISO 8601 week: " + isoOutput ) ;
请参阅此code run live at IdeOne.com。
2012-08-07是ISO 8601周:2012-W32-2
顺便说一句,如果Android能够运行ThreeTen-Extra库,您会发现它的YearWeek
类很有用。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
答案 2 :(得分:0)
在这里您可以通过oracle查看引用
https://docs.oracle.com/javase/7/docs/api/java/util/GregorianCalendar.html
我提供了一个快速的解决方案来查找当前日期的星期数。您可以按照自己的方式进行更改和优化。还要根据需要设置GMT值。
public static int getWeeksOfMonth() {
DATESTATUS = false;
VALUESTATUS = false;
int weekCount;
WEEK_OF_MONTH= -1;
// get the supported ids for GMT+04:00 (Pacific Standard Time)
String[] ids = getAvailableIDs(4 * 60 * 60 * 1000);
// if no ids were returned, something is wrong. get out.
if (ids.length == 0)
return WEEK_OF_MONTH;
// create a Pacific Standard Time time zone
SimpleTimeZone pdt = new SimpleTimeZone(4 * 60 * 60 * 1000, ids[0]);
// create a GregorianCalendar with the Pacific Daylight time zone
// and the current date and time
Calendar calendar = new GregorianCalendar(pdt);
Date trialTime = new Date();
calendar.setTime(trialTime);
weekCount = calendar.get(Calendar.WEEK_OF_YEAR);
return recursiveWeekCountCheck(calendar, weekCount);
}
private static int recursiveWeekCountCheck(Calendar calendar, int weekCount) {
if (calendar.get(Calendar.MONTH) == Calendar.DECEMBER && weekCount == 1) {
DATESTATUS = true;
calendar.add(Calendar.DAY_OF_MONTH, -1);
weekCount = calendar.get(Calendar.WEEK_OF_YEAR);
recursiveWeekCountCheck(calendar, weekCount);
}
if (!VALUESTATUS){
VALUESTATUS = true;
if (DATESTATUS) {
weekCount++;
WEEK_OF_MONTH = weekCount;
} else {
WEEK_OF_MONTH = weekCount;
}
}
return WEEK_OF_MONTH;
}
最后,只需调用方法getWeeksOfMonth();