Java日历-每周第一天与实际最小值
我正在测试我们的一个日期管理框架,它应该重置一些字段(使用) 但是,如果是,请始终返回(Java日历-每周第一天与实际最小值,java,calendar,Java,Calendar,我正在测试我们的一个日期管理框架,它应该重置一些字段(使用) 但是,如果是,请始终返回(1)作为。是虫子吗 : import java.util.*; 公共班机{ 公共静态void main(字符串[]args){ System.out.printf(“Java规范:%s%n”,System.getProperty(“Java.vm.specification.version”); System.out.printf(“Java版本:%s%n”,System.getProperty(“Java.
1
)作为。是虫子吗
:
import java.util.*;
公共班机{
公共静态void main(字符串[]args){
System.out.printf(“Java规范:%s%n”,System.getProperty(“Java.vm.specification.version”);
System.out.printf(“Java版本:%s%n”,System.getProperty(“Java.specification.version”);
System.out.printf(“VM版本:%s%n”,System.getProperty(“java.VM.version”);
Calendar cal=Calendar.getInstance(TimeZone.getTimeZone(“UTC”));
int[]天={1,5,7};
用于(整数天:天){
校准设置时间单位为毫秒(0升);
cal.setFirstDayOfWeek(天);
System.out.printf(“预期的:%d,实际的:%d%n”,天,cal.getActualMinimum(日历。周中的天));
}
}
}
您应该使用cal.getFirstDayOfWeek()instand of
cal.getActualMinimum(日历日/周)
因为
cal.getActualMinimum(Calendar.DAY\u OF_WEEK)将始终返回星期天查看java源代码中getActualMinimum(Calendar.DAY\u OF_WEEK)的实现
public int getActualMinimum(int field) {
if (field == DAY_OF_MONTH) {
GregorianCalendar gc = getNormalizedCalendar();
int year = gc.cdate.getNormalizedYear();
if (year == gregorianCutoverYear || year == gregorianCutoverYearJulian) {
long month1 = getFixedDateMonth1(gc.cdate, gc.calsys.getFixedDate(gc.cdate));
BaseCalendar.Date d = getCalendarDate(month1);
return d.getDayOfMonth();
}
}
return getMinimum(field);
}
最低要求是:-
public int getMinimum(int field) {
return MIN_VALUES[field];
}
最小值数组定义为:-
static final int MIN_VALUES[] = {
BCE, // ERA
1, // YEAR
JANUARY, // MONTH
1, // WEEK_OF_YEAR
0, // WEEK_OF_MONTH
1, // DAY_OF_MONTH
1, // DAY_OF_YEAR
SUNDAY, // DAY_OF_WEEK
1, // DAY_OF_WEEK_IN_MONTH
AM, // AM_PM
0, // HOUR
0, // HOUR_OF_DAY
0, // MINUTE
0, // SECOND
0, // MILLISECOND
-13*ONE_HOUR, // ZONE_OFFSET (UNIX compatibility)
0 // DST_OFFSET
};
您应该使用cal.getFirstDayOfWeek()instand of
cal.getActualMinimum(日历日/周)
因为
cal.getActualMinimum(Calendar.DAY\u OF_WEEK)将始终返回星期天查看java源代码中getActualMinimum(Calendar.DAY\u OF_WEEK)的实现
public int getActualMinimum(int field) {
if (field == DAY_OF_MONTH) {
GregorianCalendar gc = getNormalizedCalendar();
int year = gc.cdate.getNormalizedYear();
if (year == gregorianCutoverYear || year == gregorianCutoverYearJulian) {
long month1 = getFixedDateMonth1(gc.cdate, gc.calsys.getFixedDate(gc.cdate));
BaseCalendar.Date d = getCalendarDate(month1);
return d.getDayOfMonth();
}
}
return getMinimum(field);
}
最低要求是:-
public int getMinimum(int field) {
return MIN_VALUES[field];
}
最小值数组定义为:-
static final int MIN_VALUES[] = {
BCE, // ERA
1, // YEAR
JANUARY, // MONTH
1, // WEEK_OF_YEAR
0, // WEEK_OF_MONTH
1, // DAY_OF_MONTH
1, // DAY_OF_YEAR
SUNDAY, // DAY_OF_WEEK
1, // DAY_OF_WEEK_IN_MONTH
AM, // AM_PM
0, // HOUR
0, // HOUR_OF_DAY
0, // MINUTE
0, // SECOND
0, // MILLISECOND
-13*ONE_HOUR, // ZONE_OFFSET (UNIX compatibility)
0 // DST_OFFSET
};
答案是正确的
问题和答案都使用过时的类。与最早版本的Java捆绑在一起的旧日期时间类已经被类所取代
标准定义
根据标准定义了一周,分别为1和7
您可以向DayOfWeek
对象询问此1-7数字
int dayOfWeekNumber = DayOfWeek.WEDNESDAY.getValue();
但是不要在代码周围传递这个数字。相反,传递DayOfWeek
对象以享受有效值的好处和保证
本地化定义
对于星期几、月周和年周字段的本地化定义,请使用类
转储到控制台
System.out.println ( "weekFields_US: " + weekFields_US + " | firstDayOfWeek: " + firstDayOfWeek );
System.out.println ( "localDate: " + localDate + " | dow: " + dow + " | ordinalNumberDayOfWeek: " + ordinalNumberDayOfWeek );
System.out.println ( "ordinalNumberDayOfWeek_SundayBasedWeek: " + ordinalNumberDayOfWeek_SundayBasedWeek );
weekFields_US:weekFields[星期日,1]|星期一:星期日
定义你自己的周变化
我建议坚持指定对象来定义周。但如果你坚持,你可以定义你自己的一周变化。调用并指定(a)一周的第一天,以及(b)定义一年的第一周或一个月的第一周的最小天数
首先,为了进行比较,使用类中包含的标准ISO 8601定义获取星期几
转储到控制台
System.out.println ( "weekFields_US: " + weekFields_US + " | firstDayOfWeek: " + firstDayOfWeek );
System.out.println ( "localDate: " + localDate + " | dow: " + dow + " | ordinalNumberDayOfWeek: " + ordinalNumberDayOfWeek );
System.out.println ( "ordinalNumberDayOfWeek_SundayBasedWeek: " + ordinalNumberDayOfWeek_SundayBasedWeek );
本地日期:2016-02-03道琼斯工业平均指数:周三星期几:3
现在切换到定义我们自己的对象,再次询问星期几。上面我们看到了3
,因为2016年2月3日是星期三,所以星期一-星期二-星期三是三。下面我们看到由于星期日、星期一、星期二、星期三的原因而产生的4
// Define our own WeekFields to use in place of IsoFields.
WeekFields weekFields_SUNDAY_1 = WeekFields.of ( DayOfWeek.SUNDAY , 1 );
int ordinalNumberDayOfWeek_SundayBasedWeek = localDate.get ( weekFields_SUNDAY_1.dayOfWeek () );
转储到控制台
System.out.println ( "weekFields_US: " + weekFields_US + " | firstDayOfWeek: " + firstDayOfWeek );
System.out.println ( "localDate: " + localDate + " | dow: " + dow + " | ordinalNumberDayOfWeek: " + ordinalNumberDayOfWeek );
System.out.println ( "ordinalNumberDayOfWeek_SundayBasedWeek: " + ordinalNumberDayOfWeek_SundayBasedWeek );
星期日星期日星期几:4
(基于JodaStephen的示例)
见类似问题
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,& 要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是 该项目现已启动,建议迁移到类 您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*
类。Hibernate5和JPA2.2支持java.time
从哪里获得java.time类
- 、和更高版本-标准Java API的一部分,带有捆绑实现。
- 带来了一些小功能和修复
- 及
- 大多数java.time功能都在中向后移植到Java6和Java7
-
- Android(26+)的更高版本捆绑了java.time类的实现
- 对于早期的Android(
问题和答案都使用过时的类,与最早版本的Java捆绑在一起的旧日期时间类已经被类所取代
标准定义
根据标准定义了一周,分别为1和7
您可以向
对象询问此1-7数字DayOfWeek
但是不要在代码中传递这个数字,而是传递int dayOfWeekNumber = DayOfWeek.WEDNESDAY.getValue();
对象以享受有效值的好处和保证 本地化定义 对于星期几、月周和年周字段的本地化定义,请使用类 转储到控制台DayOfWeek
System.out.println ( "weekFields_US: " + weekFields_US + " | firstDayOfWeek: " + firstDayOfWeek );
System.out.println ( "localDate: " + localDate + " | dow: " + dow + " | ordinalNumberDayOfWeek: " + ordinalNumberDayOfWeek );
weekFields_US:weekFields[星期日,1]|星期一:星期日 定义你自己的周变化 我建议坚持指定对象来定义一周。但是如果你坚持,你可以定义你自己的一周变化。调用并指定(a)一周的第一天,以及(b)定义一年中第一周或一个月的第一周的最小天数 首先,为了进行比较,使用类中包含的标准ISO 8601定义获取星期几 转储到控制台System.out.println ( "ordinalNumberDayOfWeek_SundayBasedWeek: " + ordinalNumberDayOfWeek_SundayBasedWeek );
System.out.println ( "weekFields_US: " + weekFields_US + " | firstDayOfWeek: " + firstDayOfWeek );
System.out.println ( "localDate: " + localDate + " | dow: " + dow + " | ordinalNumberDayOfWeek: " + ordinalNumberDayOfWeek );
本地日期:2016-02-03道琼斯工业平均指数:周三星期几:3 现在切换到定义我们自己的对象,再次询问星期几编号。上面我们看到了System.out.println ( "ordinalNumberDayOfWeek_SundayBasedWeek: " + ordinalNumberDayOfWeek_SundayBasedWeek );
,因为2016年2月3日是星期三,所以星期一-星期二-星期三呈现为3。下面我们看到3
,因为星期天-星期一-星期三4
转储到控制台// Define our own WeekFields to use in place of IsoFields. WeekFields weekFields_SUNDAY_1 = WeekFields.of ( DayOfWeek.SUNDAY , 1 ); int ordinalNumberDayOfWeek_SundayBasedWeek = localDate.get ( weekFields_SUNDAY_1.dayOfWeek () );
System.out.println ( "weekFields_US: " + weekFields_US + " | firstDayOfWeek: " + firstDayOfWeek );
System.out.println ( "localDate: " + localDate + " | dow: " + dow + " | ordinalNumberDayOfWeek: " + ordinalNumberDayOfWeek );
星期日星期日星期几:4 (基于JodaStephen的示例)System.out.println ( "ordinalNumberDayOfWeek_SundayBasedWeek: " + ordinalNumberDayOfWeek_SundayBasedWeek );