簡體   English   中英

android日歷中的周數是錯誤的

[英]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

tl;博士

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 ) ;

查看此代碼在 IdeOne.com 上實時運行

2012-08-07 是 ISO 8601 周:2012-W32-2

順便說一句,如果 Android 能夠運行ThreeTen-Extra庫,您會發現它的YearWeek類很有用。


關於 java.time

java.time框架內置於 Java 8 及更高版本中。 這些類取代麻煩的老傳統日期時間類,如java.util.DateCalendar ,和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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM