java中如何确定通过周数和日数(周)的日期
我需要通过传递这些参数来获取日期java中如何确定通过周数和日数(周)的日期,java,date,calendar,gregorian-calendar,date-parsing,Java,Date,Calendar,Gregorian Calendar,Date Parsing,我需要通过传递这些参数来获取日期 年 周数(一个月内),即1,2,3,4,5 日数(一周内)0(星期日)至6(星期六) 月 我在Calendar类中查找构造函数,但不包含这些参数。要从年、周数和星期几创建日期,请使用java.util.Calendar实例: Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR, 2017); cal.set(Calendar.WEEK_OF_YEAR, 26);
我在
Calendar
类中查找构造函数,但不包含这些参数。要从年、周数和星期几创建日期,请使用java.util.Calendar
实例:
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2017);
cal.set(Calendar.WEEK_OF_YEAR, 26);
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
要从日历
转换为java.util.Date
:
Date date = cal.getTime();
要将Date
转换为java.time.LocalDateTime
使用:
LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
要从年、周数和星期几创建日期,请使用
java.util.Calendar
实例:
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2017);
cal.set(Calendar.WEEK_OF_YEAR, 26);
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
要从日历
转换为java.util.Date
:
Date date = cal.getTime();
要将Date
转换为java.time.LocalDateTime
使用:
LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
尽管您使用了标签,但我同意Joe C的评论,您应该更喜欢现代Java日期和时间API(也称为
Java.time
或JSR-310),而不是过时的日历和朋友。现代类对程序员更友好,使用起来也更方便,它们带来的惊喜更少,生成的代码更清晰、更自然(至少当你习惯了流畅的风格时),如果你出现错误,就更容易调试
我不知道你怎么计算你一个月的周数。我假设第一周从月的第一天开始,持续7天(因此第二周从月的第8天开始,第五周从月的第29天开始)。如果您的计数不同,请参阅
我建议这种方法:
public static LocalDate weekNoAndDayToDate(Year year, Month month, int weekOfMonth, int dayOfWeek) {
// find day of week: convert from 0 (Sunday) to 6 (Saturday)
// to DayOfWeek, from 1 (Monday) to 7 (Sunday)
DayOfWeek dow;
if (dayOfWeek == 0) { // Sunday
dow = DayOfWeek.SUNDAY;
} else {
dow = DayOfWeek.of(dayOfWeek);
}
return year.atMonth(month)
.atDay(1)
.with(TemporalAdjusters.nextOrSame(dow))
.with(ChronoField.ALIGNED_WEEK_OF_MONTH, weekOfMonth);
}
例如,我们可以这样做
LocalDate today = weekNoAndDayToDate(Year.of(2017), Month.JULY, 1, 1);
这就产生了
2017-07-03
如果需要日期
或格雷戈里安日历
,例如,对于无法更改的旧API,请执行以下操作之一:
Date oldfashiondDateObject
= Date.from(today.atStartOfDay(ZoneId.systemDefault()).toInstant());
GregorianCalendar oldfashionedCalendarObject
= GregorianCalendar.from(today.atStartOfDay(ZoneId.systemDefault()));
在这两种情况下,结果在不同的时区是不同的(旧类固有的问题之一)。在我的计算机上,第一个生成日期
Mon Jul 03 00:00:00 CEST 2017
第二种方法产生了一个与同一时间点相等的GregorianCalendar
。尽管你的标签我同意Joe C的评论,但你应该更喜欢现代Java日期和时间API(也称为Java.time
或JSR-310),而不是过时很久的日历和朋友。现代类对程序员更友好,使用起来也更方便,它们带来的惊喜更少,生成的代码更清晰、更自然(至少当你习惯了流畅的风格时),如果你出现错误,就更容易调试
我不知道你怎么计算你一个月的周数。我假设第一周从月的第一天开始,持续7天(因此第二周从月的第8天开始,第五周从月的第29天开始)。如果您的计数不同,请参阅
我建议这种方法:
public static LocalDate weekNoAndDayToDate(Year year, Month month, int weekOfMonth, int dayOfWeek) {
// find day of week: convert from 0 (Sunday) to 6 (Saturday)
// to DayOfWeek, from 1 (Monday) to 7 (Sunday)
DayOfWeek dow;
if (dayOfWeek == 0) { // Sunday
dow = DayOfWeek.SUNDAY;
} else {
dow = DayOfWeek.of(dayOfWeek);
}
return year.atMonth(month)
.atDay(1)
.with(TemporalAdjusters.nextOrSame(dow))
.with(ChronoField.ALIGNED_WEEK_OF_MONTH, weekOfMonth);
}
例如,我们可以这样做
LocalDate today = weekNoAndDayToDate(Year.of(2017), Month.JULY, 1, 1);
这就产生了
2017-07-03
如果需要日期
或格雷戈里安日历
,例如,对于无法更改的旧API,请执行以下操作之一:
Date oldfashiondDateObject
= Date.from(today.atStartOfDay(ZoneId.systemDefault()).toInstant());
GregorianCalendar oldfashionedCalendarObject
= GregorianCalendar.from(today.atStartOfDay(ZoneId.systemDefault()));
在这两种情况下,结果在不同的时区是不同的(旧类固有的问题之一)。在我的计算机上,第一个生成日期
Mon Jul 03 00:00:00 CEST 2017
第二个生成一个等于相同时间点的GregoriaCalendar
。因为,您需要定义一周从哪一天开始,以及第一周必须考虑多少天
例如,ISO-8601标准考虑:
- 星期一是一周的第一天
- 第一周的最小天数:标准将第一周计算为至少需要4天
月份分为多个时段,每个时段从定义的每周第一天开始。如果当月最早的时间段少于最小天数,则称为周0
,如果至少有最小天数,则称为周1
根据您如何定义这些,您可以得到不同的结果。考虑2017年7月的日历:
July 2017
Su Mo Tu We Th Fr Sa
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
如果我们考虑ISO的定义,我们就有:
- 第零周-2017-07-01至2017-07-02
- 第一周:2017-07-03至2017-07-09
- 第2周:2017-07-10至2017-07-16
- 第3周:2017-07-17至2017-07-22
- 第4周:2017-07-23至2017-07-30
- 第5周:2017-07-31
如果我们把第一天作为星期日,第一周的最小天数为1,我们就有:
- 第一周:2017-07-01
- 第2周:2017-07-02至2017-07-08
- 第3周:2017-07-09至2017-07-15
- 第4周:2017-07-16至2017-07-21
- 第5周:2017-07-22至2017-07-29
- 第6周:2017-07-30至2017-07-31
由于已经发布了一个带有Calendar
的解决方案,我将使用新的API编写一个解决方案。如果使用<强> java 8 < /强>,请考虑使用这更容易
如果使用的是JavaAs,则需要定义一周从哪一天开始,以及第一周必须考虑的天数
例如,ISO-8601标准考虑:
- 星期一是一周的第一天
- 第一周的最小天数:标准将第一周计算为至少需要4天
月份分为多个时段,每个时段从定义的每周第一天开始。如果当月最早的时间段少于最小天数,则称为周0
,如果至少有最小天数,则称为周1
根据您如何定义这些,您可以得到不同的结果。考虑2017年7月的日历:
July 2017
Su Mo Tu We Th Fr Sa
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
如果我们考虑ISO的定义,我们就有:
- 第零周-2017-07-01至2017-07-02
- 第一周:2017-07-03至2017-07-09
- 第2周