如果今天是星期天,如何获得下周的日期?我希望得到下周一周六到周六的日期。
我使用以下代码获取日期:
private String[] getDaysOfWeek() {
String[] days = new String[6];
SimpleDateFormat format = new SimpleDateFormat("dd");
Calendar c = GregorianCalendar.getInstance();
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
for (int i = 0; i < 6; i++) {
if (i == 0) {
days[i] = format.format(c.getTime());
} else {
c.add(Calendar.DATE, 1);
days[i] = format.format(c.getTime());
}
System.out.println("DateTest" + days[i]);
}
return days;
}
当我设置设备语言英语(美国)时,它工作正常,但如果设备设置为语言英语(英国),它返回上一周的日期。
我建议您使用java.time
,现代Java日期和时间API,也称为JSR-310,用于像这样的非平凡日期操作。你能在非全新的Android设备上做到这一点吗?当然!获取ThreeTenABP并开始编码。这是JSR-310的Android Backport。在this question: How to use ThreeTenABP in Android Project有一个彻底的解释。
private static String[] getDaysOfWeek() {
String[] days = new String[6];
DateTimeFormatter dayOfMonthFormatter = DateTimeFormatter.ofPattern("dd");
LocalDate today = LocalDate.now(ZoneId.of("America/Montreal"));
// go back to Sunday, then forward 1 day to get Monday
LocalDate day = today.with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY))
.plusDays(1);
days[0] = day.format(dayOfMonthFormatter);
for (int i = 1; i < 6; i++) {
day = day.plusDays(1);
days[i] = day.format(dayOfMonthFormatter);
}
return days;
}
今天打电话给这种方法(12月10日星期日,在蒙特利尔)我得到了下周的星期几:
[11, 12, 13, 14, 15, 16]
我将Mac的区域设置从丹麦(欧洲)改为美国,并得到了相同的结果。
由于它在地球上的所有时区都不是同一天,我建议给出明确的时区来获取今天的日期。请替换我放置美国/蒙特利尔所需的时区。我们不能使用设备的时区设置吗?也许。您可以使用JVM的时区设置(这也是您的问题中的代码默认设置)。我建议您通过将ZoneId.systemDefault()
指定为时区来在代码中明确说明。但是,程序的其他部分或在同一JVM中运行的其他程序可能会更改JVM设置,因此无法保证为您提供设备的首选项设置。
学习java.time
的一个来源是the Oracle tutorial。您的搜索引擎可以指向许多其他人。
PS我原本以为WeekFields.SUNDAY_START
可能对这项任务有所帮助,但我没有找到一个很好的方法来使用它。如果有人能发现我错过的东西,我会感激一丝暗示。
Answer by Ole V.V.是正确和有用的:
Calendar
。TemporalAdjusters.previousOrSame
获取下一个所需日期的日期。或TemporalAdjusters.nextOrSame
取决于您的业务逻辑,在您的问题中不明确。LocalDate::datesUntil
如果你想获得花哨,你可以使用Java 9及更高版本中添加的for
方法用一个Stream替换该Answer中的LocalDate.datesUntil
循环。
从今天开始,从那里开始。
LocalDate today = LocalDate.now( ZoneId.of( "Pacific/Auckland" ) ) ;
LocalDate nextOrSameMonday = today.with( TemporalAdjusters.nextOrSame( DayOfWeek.MONDAY ) ) ;
制作一周的日期流。
Stream<LocalDate> stream = nextOrSameMonday.datesUntil( nextOrSameMonday.plusWeeks( 1 ) ) ;
收集流到List
。
List< LocalDate > dates = stream.collect( Collectors.toList() ) ;
转储到控制台。
System.out.println( dates ) ;
[2019-04-08, 2019-04-09, 2019-04-10, 2019-04-11, 2019-04-12, 2019-04-13, 2019-04-14]
如果您只想要日期编号:
for ( LocalDate date : dates )
{
System.out.println( date.getDayOfMonth() );
}
或者更改流处理以收集整数列表,即月份数字。