我如何在java中按升序获取从当天算起的最后7天?

问题描述 投票:0回答:10

我使用以下代码来获取最近 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 天的数据?

java date
10个回答
14
投票

我会稍微简化你的方法,如果你想要这个输出,你不需要创建一个

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 

工作 IDEONE 演示


6
投票

使用 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 天,我现在不知道。


2
投票

这里有一个建议:

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);
}

2
投票

以另一种方式循环:

    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 

2
投票

这是我的两分钱,使用 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
的参数。这是因为给定的日期是排他性的。


1
投票

Collections.sort

您可以使用

Collections.sort
方法。这是一个静态方法。您将列表和比较器传递给它。它对列表使用修改后的合并排序算法。这就是为什么您必须向其传递一个比较器来进行成对比较。这个问题之前也已经回答过。

按日期对ArrayList中的对象进行排序?


1
投票

其他答案使用旧的过时的类或过于复杂。

java.time

旧的日期时间类已被 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 );

一次循环一天,直到达到极限。随着我们递增,收集每个日期。

A

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 );

0
投票

试试这个:

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));
    }

}

0
投票

您可以尝试使用向后循环,而不是向前循环。替换以下两行代码:

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 的解决方案


0
投票

如果天数是恒定的,您可以简单地从末尾开始填充数组(当然在分配表格之后:

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.