繁体   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