java - Android Java 日历替代品,具有以下功能

标签 java android calendar

我需要从星期一开始我的日历。 根据今天的日期(2012 年 8 月 7 日),第一天为星期一,一周中的最少天数为 1,java 为我提供一年中的第 33 周,而 android 为 32,为什么?

所以我需要具有以下功能的日历替代品。 我正在使用的代码:

Calendar cal = Calendar.getInstance();
cal.setFirstDayOfWeek(Calendar.MONDAY);
cal.setMinimalDaysInFirstWeek(1);

out("For date : "+df.format(cal.getTime())+" Week = "+cal.get(Calendar.WEEK_OF_YEAR));

有什么帮助吗?

最佳答案

tl;dr

LocalDate.of( 2012 , Month.AUGUST , 7 )
         .get( IsoFields.WEEK_OF_WEEK_BASED_YEAR ) 

32

语言环境

不确定您问题的直接答案,但很可能是不同的 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 is ISO 8601 week: 2012-W32-2

顺便说一下,如果 Android 能够运行 ThreeTen-Extra图书馆,你会发现它的YearWeek类有用。


关于java.time

java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date , Calendar , & SimpleDateFormat .

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

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

从哪里获得 java.time 类?

关于java - Android Java 日历替代品,具有以下功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11845425/

相关文章:

java - JFrame 显示黑屏,右上角有一个白色的小矩形

java - 我如何构建多线程代码以更好地重用java中的代码?

java - 使用日期选择器 android 从今天开始检查用户是否超过 18 年

android - android中 GridView 中的不同列名

java - 为什么日历值不同?

java - java中读取jar外部的xml文件

android - Espresso : matches multiple views in the hierarchy

java - 在Android中运行 Espresso 测试时出现内存不足的问题

javascript - 尝试使用日期选择器 JavaScript 创建事件日历

java - 错误 : Java: invalid target release: 11 - IntelliJ IDEA