Android日历中的周数错误

时间:2014-12-19 07:48:41

标签: android

Android日历中的周数错误

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

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

3 个答案:

答案 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)

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.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance 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();