我正在开发一款能够显示活动列表的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设计:
答案 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属性,因此实际上非常简单
首先确定你想要的周数
例如:我只需要从Mon
到Sun
一周
因此,此处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:58
,3 March 2017 6:20 to 6:50
,8 March 2017 12:00 to 13:00
running
- 2 March 2017 6:10 to 8:00
,3 2017 March 7:00 to 8:00
,9 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 March
,week nth+1
相似,SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
也类似,等等。{/ p>
现在您将拥有类似的内容:
第n周:
第n周+ 1:
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
来获得包含Week
和week
号码的列表,此Week
号码可用作比较日期的标识符,然后您就可以添加具有相同/Library/LaunchAgents/net.pulsesecure.pulsetray.plist
个数字的日期的活动。
希望您能得到我想在此处传达的内容:)
答案 2 :(得分:1)
你没有按周定义你的意思。
您希望将哪个时区用作确定日期的上下文?或者你想保持你的日期时间为UTC,就像Stack Overflow跟踪你的“今天”与“昨天”的活动一样吗?
应尽可能避免麻烦的旧日期类,包括Date
和Calendar
。它们现在被java.time类取代。
将您给定的Date
个对象转换为Instant
,这是UTC时间轴上的一个时刻。
Instant instant = myDate.toInstant();
我建议尽可能使用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() );
您可以针对由此yearOfWeekBasedYear
和weekNumber
组成的字符串跟踪您的记录。使用标准格式,yyyy-Www,例如2017-W07
。
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]
正是我需要的!所以现在我可以遍历每周并总结统计数据,从而制定清单的“每周”视图