【问题标题】:Week number is wrong in android calendarAndroid日历中的周数错误
【发布时间】:2020-03-11 23:48:23
【问题描述】:

android 日历中的周数错误

在某些设备中获得第 53 周,但在其他一些设备中获得为年底第 1 周

日历日历 = Calendar.getInstance(); int week = calender.get(Calendar.WEEK_OF_YEAR);

【问题讨论】:

  • 特定于区域设置的行为与依赖默认区域设置相结合?

标签: android


【解决方案1】:

第一周

日历使用两个 参数:一周的第一天和 first 中的最少天数 周(从 1 到 7)。这些数字取自语言环境资源 构建日历时的数据。它们也可以被指定 明确地通过设置它们的值的方法。

在设置或获取 WEEK_OF_MONTH 或 WEEK_OF_YEAR 字段时,Calendar 必须将月份或年份的第一周确定为 参照点。 一个月或一年的第一周被定义为 从 getFirstDayOfWeek() 和 至少包含该月的 getMinimalDaysInFirstWeek() 天或 年。周数 ..., -1, 0 在第一周之前;周数 2, 3,... 跟着它。请注意,归一化编号返回 get() 可能不同。例如,一个特定的 Calendar 子类可能 将一年中第 1 周的前一周指定为前一周的第 n 周 年。

来自 Java 文档 (https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html)

【讨论】:

  • 你似乎在引用什么……但是从哪里来的?
  • 这是来自java.util.Calendar,现在我再次阅读,不清楚我指的是“特定于区域设置”以及如何计算第一周。一定是忙碌的一天...
  • 感谢您添加链接。干杯。
【解决方案2】:

tl;博士

LocalDate.of( 2018 , Month.DECEMBER , 31 )
         .get( IsoFields.WEEK_OF_WEEK_BASED_YEAR ) 

1

语言环境

不确定您的问题的直接答案,但可能有不同的Locale 值在起作用。在Calendar 中,一周的定义因地区而异。

但是这是没有实际意义的。您应该使用替换 Calendar 类的 java.time 类。

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.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

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

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

从哪里获得 java.time 类?

【讨论】:

    【解决方案3】:

    这里可以通过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();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-21
      • 2017-10-05
      • 2019-03-13
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多