我使用以下代码来获取最近 7 天的信息:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd ");
Calendar cal = Calendar.getInstance();
Date date = cal.getTime();
String[] days = new String[6];
days[0] = sdf.format(date);
for(int i = 1; i < 6; i++){
cal.add(Calendar.DAY_OF_MONTH, -1);
date = cal.getTime();
days[i] = sdf.format(date);
}
for(String x: days){
System.out.println(x);
}
这给出了以下输出:
2016-04-14
2016-04-13
2016-04-12
2016-04-11
2016-04-10
2016-04-09
但我想要这个:
2016-04-09
2016-04-10
2016-04-11
2016-04-12
2016-04-13
2016-04-14
如果我在代码下面使用以下行,它将给出正确的顺序:
List<String> list = Arrays.asList(days);
Collections.reverse(list);
days = (String[]) list.toArray();
for(String x: days){
System.out.println(x);
}
但是有没有其他方法可以一次性按升序获取最近 7 天的数据?
我会稍微简化你的方法,如果你想要这个输出,你不需要创建一个
String[]
数组,或者循环两次,你可以用一个for-loop
,一个Calendar
和SimpleDateFormat
来实现相同的效果
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd ");
Calendar cal = Calendar.getInstance();
// get starting date
cal.add(Calendar.DAY_OF_YEAR, -6);
// loop adding one day in each iteration
for(int i = 0; i< 6; i++){
cal.add(Calendar.DAY_OF_YEAR, 1);
System.out.println(sdf.format(cal.getTime()));
}
输出:
2016-04-09
2016-04-10
2016-04-11
2016-04-12
2016-04-13
2016-04-14
使用 java8 和 joda 你可以编写如下内容:
LocalDate weekBeforeToday = LocalDate.now().minusDays(7);
IntStream.rangeClosed(1, 7)
.mapToObj(weekBeforeToday::plusDays)
.forEach(System.out::println);
打印:
2016-04-08
2016-04-09
2016-04-10
2016-04-11
2016-04-12
2016-04-13
2016-04-14
如果你需要收集,你必须使用收集器。
在你的例子中,你打印了 6 天,所以如果这是你的错误或者你需要 6 天而不是 7 天,我现在不知道。
这里有一个建议:
String[] days = new String[6];
for (int i = 0; i < days.length; i++) {
days[i] = LocalDate.now().minusDays(days.length - i - 1).toString();
}
for (String x : days) {
System.out.println(x);
}
使用列表可能会更清楚:
List<String> days = new ArrayList<> ();
LocalDate now = LocalDate.now();
for (LocalDate d = now.minusDays(5); !d.isAfter(now); d = d.plusDays(1)) {
days.add(d.toString());
}
for (String x : days) {
System.out.println(x);
}
以另一种方式循环:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd ");
Calendar cal = Calendar.getInstance();
Date date=cal.getTime();
String[] days = new String[6];
days[0]=sdf.format(date);
for(int i = 1; i< 6; i++){
cal.add(Calendar.DAY_OF_MONTH,-1);
date=cal.getTime();
days[i]=sdf.format(date);
}
for(int i = (days.length-1); i >= 0; i--){
System.out.println(days[i]);
}
这是输出:
2016-04-09
2016-04-10
2016-04-11
2016-04-12
2016-04-13
2016-04-14
这是我的两分钱,使用 Streams:
LocalDate start = LocalDate.now().minusDays(6);
Stream.iterate(start, date -> date.plusDays(1))
.limit(7)
.toList();
作为 Ole V.V.评论中提到,从 Java 9 开始,他们添加了一个方便的方法来获取日期流:
LocalDate::datesUntil
。
然后它看起来像这样:
LocalDate now = LocalDate.now();
now.minusDays(6).datesUntil(now.plusDays(1))
.toList();
因为您希望结束日期为今天,所以我们需要提供
now.plusDays(1)
作为 datesUntil
的参数。这是因为给定的日期是排他性的。
Collections.sort
Collections.sort
方法。这是一个静态方法。您将列表和比较器传递给它。它对列表使用修改后的合并排序算法。这就是为什么您必须向其传递一个比较器来进行成对比较。这个问题之前也已经回答过。
其他答案使用旧的过时的类或过于复杂。
旧的日期时间类已被 Java 8 及更高版本中内置的 java.time 框架取代,并向后移植到 Java 6 和 7 以及 Android。事实证明,旧的类设计不佳、令人困惑且麻烦。避开他们。
LocalDate
新类中的
LocalDate
表示仅日期值,没有时间和时区。虽然未存储,但需要时区来确定“今天”。东方的黎明较早,因此不同时区的日期可能有所不同,巴黎为“明天”,蒙特利尔为“昨天”。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( zoneId );
您可以加减。我们想回到一周,所以减去一周。
LocalDate limit = today.minusWeeks( 1 );
一次循环一天,直到达到极限。随着我们递增,收集每个日期。
List
是一个有序集合,一个序列。 ArrayList
类是满足我们需求的适当实现。
List< LocalDate > list = new ArrayList<>();
当每个递减的日期仍晚于我们的停止点(一周前)时循环。
LocalDate localDate = today;
while ( localDate.isAfter( limit ) ) {
list.add( localDate );
// Setup next loop.
localDate = localDate.minusDays( 1 );
}
最后,按照您想要的方向对列表进行排序。
Collections
类(注意名称中的复数's')提供了许多实用方法。请致电 sort
以获取自然顺序。调用 reverse
来表示与自然顺序相反的情况。
Collections.sort( list );
Collections.reverse( list );
试试这个:
将
days
更改为Date
数组,然后将其转换为列表并使用Collections.sort(list);
对列表进行排序
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd ");
Calendar cal = Calendar.getInstance();
Date date=cal.getTime();
Date[] days = new Date[6];
days[0]= date;
for(int i = 1; i< 6; i++){
cal.add(Calendar.DAY_OF_MONTH,-1);
date=cal.getTime();
days[i]=date;
}
List<Date> list = Arrays.asList(days);
Collections.sort(list);
for(Date x: days){
System.out.println(sdf.format(x));
}
}
您可以尝试使用向后循环,而不是向前循环。替换以下两行代码:
days[0] = sdf.format(date);
for(int i = 1; i < 6; i++){
与:
days[days.length - 1] = sdf.format(date);
for(int i = days.length - 2; i >= 0; i--){
输出:
2016-04-14
2016-04-13
2016-04-12
2016-04-11
2016-04-10
2016-04-09
编辑:更好的是,使用Jordi Castilla 的解决方案。
如果天数是恒定的,您可以简单地从末尾开始填充数组(当然在分配表格之后:
new String[DAYS]
):
private static final DAYS = 6;
//...
for(int i = DAYS; i >= 0; i--){
cal.add(Calendar.DAY_OF_MONTH,-1);
date = cal.getTime();
days[i] = sdf.format(date);
}