[英]Week number is wrong in android calendar
android日歷中的周數是錯誤的
在某些設備中作為第 53 周,但在其他一些設備中作為年末的第 1 周
日歷日歷 = Calendar.getInstance(); int 周 = calender.get(Calendar.WEEK_OF_YEAR);
第一周
Calendar 使用兩個參數定義了特定於語言環境的每周 7 天:一周的第一天和第一周的最少天數(從 1 到 7)。 這些數字是在構造 Calendar 時從語言環境資源數據中獲取的。 它們也可以通過設置它們的值的方法明確指定。
設置或獲取 WEEK_OF_MONTH 或 WEEK_OF_YEAR 字段時,日歷必須確定月份或年份的第一周作為參考點。 一個月或一年的第一周定義為從 getFirstDayOfWeek() 開始並至少包含該月或年的 getMinimalDaysInFirstWeek() 天數的最早 7 天。 周數 ..., -1, 0 在第一周之前; 周數為 2、3、... 跟着它。 請注意,get() 返回的規范化編號可能不同。 例如,特定的 Calendar 子類可以將一年的第 1 周之前的一周指定為前一年的第 n 周。
來自 Java 文檔( https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html )
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 定義:第 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 ) ;
使用YYYY-Www-D
標准ISO 8601 格式轉儲到控制台。
String isoOutput = yearOfWeekBasedYear + "-W" + String.format("%02d", weekOfWeekBasedYear) + "-" + dayOfWeekNumber ;
System.out.println( ld + " is ISO 8601 week: " + isoOutput ) ;
2012-08-07 是 ISO 8601 周:2012-W32-2
順便說一句,如果 Android 能夠運行ThreeTen-Extra庫,您會發現它的YearWeek
類很有用。
java.time框架內置於 Java 8 及更高版本中。 這些類取代麻煩的老傳統日期時間類,如java.util.Date
, Calendar
,和SimpleDateFormat
。
現在處於維護模式的Joda-Time項目建議遷移到java.time類。
要了解更多信息,請參閱Oracle 教程。 並在 Stack Overflow 上搜索許多示例和解釋。 規范是JSR 310 。
從哪里獲得 java.time 類?
在這里可以查看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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.