如何在Java中将日期列表分组到相应的周?

时间:2017-03-09 09:05:11

标签: java android date java-date

我正在开发一款能够显示活动列表的Android应用。每项活动(即waling,running)都有一个财产日期(即2017年3月9日8:58)。我在屏幕上有两个按钮 - 每日和每周,我想切换两个按钮并相应地更改列表。现在,对于Daily列表,我不必更改任何内容,因为每天都会创建一个新的Activity。

但是,我不确定如何查看每周列表。它将基本上计算统计数据(将各个周的统计数据相加)。

例如,我有一个过去50天的日期列表。如何区分代表单个星期的单个日期列表,以便我可以构建一个周列表?基本上,将这50个日期转换为相当于一周的日期(例如约7周)

这是我试图首先工作的日期测试列表:

HashMap<Integer,Date> dateHashMap = new HashMap<>();

    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    List<Date> dates = new ArrayList<>();


    dates.add(sdf.parse("10/03/2017"));
    dates.add(sdf.parse("9/03/2017"));
    dates.add(sdf.parse("8/03/2017"));
    dates.add(sdf.parse("7/03/2017"));
    dates.add(sdf.parse("6/03/2017"));

    dates.add(sdf.parse("23/02/2017"));
    dates.add(sdf.parse("3/02/2017"));

    dates.add(sdf.parse("2/02/2017"));
    dates.add(sdf.parse("1/02/2017"));


    for(Date d:dates){

        dateHashMap.put(d.getDay(),d);
    }

    System.out.println(dateHashMap.toString());

我想要实现的示例UI设计:

enter image description here

4 个答案:

答案 0 :(得分:1)

/**
 * Gets a list of week numbers (as strings) from a list of dates.
 *
 * @param listOfDates the list of dates
 * @return a list of week in year (as string), corresponding
 *         one-to-one to the values in the input list.
 */
public List<String> getListOfWeeksFromListOfDates(List<Date> listOfDates) {
    List<String> listOfWeeks = new ArrayList<>();

    for (Date date : listOfDates) {
        listOfWeeks.add(new SimpleDateFormat("w").format(date));
    }

    return listOfWeeks;
}

答案 1 :(得分:1)

由于您已经为每个活动设置了Date属性,因此实际上非常简单

首先确定你想要的周数 例如:我只需要从MonSun一周

week view

因此,此处Week nth将包含日期 - 1st to 5th March
Week nth+1将有6th to 12th March等等。 并且据我所知,你已经拥有财产日期的所有活动(即waling,running)(即2017年3月9日8:58)

所以在这里举个例子(让我知道这是不是你的数据如何):
waling - 1 March 2017 8:58 to 9:583 March 2017 6:20 to 6:508 March 2017 12:00 to 13:00

running - 2 March 2017 6:10 to 8:003 2017 March 7:00 to 8:009 March 2017 5:50 to 7:00

现在,Week nth的数据可以通过将waling活动的1st活动的持续时间与3rd March的{​​{1}}相加来计算,仅在这些日期出现在waling Week nth上,March 2017同样适用于week nth+1等等 running week nth活动的2nd March活动与3rd Marchweek nth+1相似,SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");也类似,等等。{/ p>

现在您将拥有类似的内容:

  

第n周:

  • 哀嚎 - 1小时30分钟
  • 跑步 - 2小时50分钟
  

第n周+ 1:

  • 哀嚎 - 1小时
  • 跑步 - 1小时10分钟


    点击每个活动,您可以显示更多细节..
    希望这可以帮助 :)

    修改:
    考虑到这是您的日期列表

List<Date> dates = new ArrayList<>(); try { dates.add(sdf.parse("10/03/2017")); dates.add(sdf.parse("9/03/2017")); dates.add(sdf.parse("8/03/2017")); dates.add(sdf.parse("7/03/2017")); dates.add(sdf.parse("6/03/2017")); dates.add(sdf.parse("23/02/2017")); dates.add(sdf.parse("3/02/2017")); dates.add(sdf.parse("2/02/2017")); dates.add(sdf.parse("1/02/2017")); } catch (ParseException e) { e.printStackTrace(); }

List

你可以创建一个自定义public List<WeekDay> getListOfWeeksFromListOfDates(List<Date> listOfDates) { List<WeekDay> listOfWeeks = new ArrayList<>(); WeekDay weekDay; for (Date date : listOfDates) { weekDay = new WeekDay(date, new SimpleDateFormat("w").format(date)); listOfWeeks.add(weekDay); } return listOfWeeks; } public class WeekDay { Date date; String weekIdentifier; public WeekDay(Date Date, String WeekIdentifier) { this.date = Date; this.weekIdentifier = WeekIdentifier; } public Date getDate() { return date; } public String getWeekIdentifier() { return weekIdentifier; } } ,只是为了确定同一周内的日期
前(我刚刚使用了@Jameson在他的回答中建议的内容,你总是可以写得更好) :

getListOfWeeksFromListOfDates(dates);

您可以使用Dates来获得包含Weekweek号码的列表,此Week号码可用作比较日期的标识符,然后您就可以添加具有相同/Library/LaunchAgents/net.pulsesecure.pulsetray.plist个数字的日期的活动。
希望您能得到我想在此处传达的内容:)

答案 2 :(得分:1)

周?

你没有按周定义你的意思。

  • 您的意思是标准ISO 8601 week每周从星期一开始,第1周包含第一个星期四,每周编号为1-52或53?
  • 或者你的意思是从星期日开始的美国型周,从1月1日开始编号为1-52 / 53周,如果是,那么上一年或新年的前一周的最后几天是什么时候?
  • 或者你的意思是什么?

时区?

您希望将哪个时区用作确定日期的上下文?或者你想保持你的日期时间为UTC,就像Stack Overflow跟踪你的“今天”与“昨天”的活动一样吗?

避免遗留日期时间类

应尽可能避免麻烦的旧日期类,包括DateCalendar。它们现在被java.time类取代。

将您给定的Date个对象转换为Instant,这是UTC时间轴上的一个时刻。

Instant instant = myDate.toInstant();

ISO 8601

我建议尽可能使用standard week

Instant调整到所需的时区。

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

检索标准周数。

int weekNumber = zdt.get( WeekFields.ISO.weekOfWeekBasedYear() );

请注意,本周编号的年份编号不是日历年。我们想要以一周为基础的年份。例如,在某些年份,12月30日和31日可以属于下一年的基于一周的年份数。

int yearOfWeekBasedYear = zdt.get( WeekFields.ISO.weekBasedYear() );

您可以针对由此yearOfWeekBasedYearweekNumber组成的字符串跟踪您的记录。使用标准格式,yyyy-Www,例如2017-W07

ThreeTen-Extra YearWeek

相反,我建议您使用有意义的对象而不仅仅是字符串。将ThreeTen-Extra库添加到项目中以获得YearWeek类。

此代码替换了我们上面执行的WeekFields代码。

YearWeek yw = YearWeek.from( zdt );

答案 3 :(得分:0)

感谢@shadygoneinsane和@ Basil Bourque指出我正确的方向,我通过以下方式解决了问题:

TreeMap<Integer, List<Date>> dateHashMap = new TreeMap<>();

    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    List<Date> dates = new ArrayList<>();


    dates.add(sdf.parse("10/03/2017"));
    dates.add(sdf.parse("9/03/2017"));
    dates.add(sdf.parse("8/03/2017"));
    dates.add(sdf.parse("7/03/2017"));
    dates.add(sdf.parse("6/03/2017"));

    dates.add(sdf.parse("23/02/2017"));
    dates.add(sdf.parse("3/02/2017"));

    dates.add(sdf.parse("2/02/2017"));
    dates.add(sdf.parse("1/02/2017"));


    for (int i = 0; i < dates.size(); i++) {
        List<Date> datesList = new ArrayList<>();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(dates.get(i));

        int weekOfMonth = calendar.get(Calendar.WEEK_OF_MONTH);

        for (Date date : dates) {
            Calendar c = Calendar.getInstance();
            c.setTime(date);
            if (weekOfMonth == c.get(Calendar.WEEK_OF_MONTH)) {
                datesList.add(date);
            }
        }

        dateHashMap.put(weekOfMonth, datesList);


    }

    System.out.println(dateHashMap.toString());
}

结果:

输出:

1=[Fri Feb 03 00:00:00 GMT 2017,
 Thu Feb 02 00:00:00 GMT 2017,
 Wed Feb 01 00:00:00 GMT 2017],
 2=[Fri Mar 10 00:00:00 GMT 2017,
 Thu Mar 09 00:00:00 GMT 2017,
 Wed Mar 08 00:00:00 GMT 2017,
 Tue Mar 07 00:00:00 GMT 2017,
 Mon Mar 06 00:00:00 GMT 2017],
 4=[Thu Feb 23 00:00:00 GMT 2017]

正是我需要的!所以现在我可以遍历每周并总结统计数据,从而制定清单的“每周”视图