我正在开发一款能够持续监控用户身体活动和不活动水平的应用。我想弄清楚提供一个星期的开始和结束日期。例如,3月3日是我提供的日期,我希望得到本周的开始和结束日期 - > 2月27日 - 3月5日。有可能吗?
以下代码我刚刚连接活动列表的最后一个日期和第一个日期(每天创建一个)。
private String formatDate(List<Activity> activities) {
Calendar calendar = Calendar.getInstance(Locale.UK);
Date date = activities.get(activities.size() - 1).getDate();
calendar.setTime(date);
String output = "" + calendar.get(Calendar.DAY_OF_MONTH) + " "
+ calendar.getDisplayName(Calendar.MONTH, Calendar.SHORT, Locale.UK);
calendar.setTime(activities.get(0).getDate());
output += " - " + calendar.get(Calendar.DAY_OF_MONTH) + " "
+ calendar.getDisplayName(Calendar.MONTH, Calendar.SHORT, Locale.UK);
return output;
}
注意:我必须提到List作为参数是每周分组的所有活动
但是,使用这种方法时,如果该人未使用该应用程序(即未登录 - >该应用程序停止监控)并且文本标签看起来像那样,则会出现问题 (例如本周只有一项活动)
有什么建议吗?
答案 0 :(得分:2)
这很简单:
calendar.set(Calendar.DAY_OF_WEEK, calendar.getFirstDayOfWeek());
一周中的第一天取决于所使用的Locale
。
要获得一周的最后一天,请执行:
calendar.add(Calendar.DAY_OF_YEAR, 6);
答案 1 :(得分:1)
您只需使用Calendar.DAY_OF_WEEK
参数计算减去的天数 - 例如打印当前周的开始和结束时间:
public static void main(String[] args) {
Calendar calendar = GregorianCalendar.getInstance();
// Subtract number of days to start of week
calendar.add(Calendar.DATE, -(calendar.get(Calendar.DAY_OF_WEEK)-1));
String output = "" + calendar.get(Calendar.DAY_OF_MONTH) + " "
+ calendar.getDisplayName(Calendar.MONTH, Calendar.SHORT, Locale.UK);
calendar.add(Calendar.DATE, 6);
output += " - " + calendar.get(Calendar.DAY_OF_MONTH) + " "
+ calendar.getDisplayName(Calendar.MONTH, Calendar.SHORT, Locale.UK);
System.out.println(output);
}
答案 2 :(得分:1)
旧的日期时间 API(java.util
日期时间类型及其格式类型,SimpleDateFormat
等)已经过时且容易出错。建议完全停止使用,改用java.time
,modern date-time API*。
使用现代 API java.time
的解决方案:
对于 ISO 8601 周(周一至周日),您可以将 ChronoField.DAY_OF_WEEK
用作 1 表示一周的第一天,并将其用作 7 表示一周的最后一天。
import java.time.LocalDate;
import java.time.Month;
import java.time.temporal.ChronoField;
public class Main {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2017, Month.MARCH, 3);
LocalDate firstDayOfTheWeek = date.with(ChronoField.DAY_OF_WEEK, 1);
System.out.println(firstDayOfTheWeek); // 2017-02-27
LocalDate lastDayOfTheWeek = date.with(ChronoField.DAY_OF_WEEK, 7);
System.out.println(lastDayOfTheWeek); // 2017-03-05
}
}
或者,
import java.time.LocalDate;
import java.time.Month;
import java.time.temporal.WeekFields;
public class Main {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2017, Month.MARCH, 3);
LocalDate firstDayOfTheWeek = date.with(WeekFields.ISO.getFirstDayOfWeek());
System.out.println(firstDayOfTheWeek); // 2017-02-27
LocalDate lastDayOfTheWeek = firstDayOfTheWeek.plusDays(6);
System.out.println(lastDayOfTheWeek); // 2017-03-05
}
}
使用 WeekFields#of(Locale locale)
获得特定于 Locale
的结果(感谢 Ole V.V. 的建议):
import java.time.LocalDate;
import java.time.Month;
import java.time.temporal.WeekFields;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2017, Month.MARCH, 3);
System.out.println("France:");
LocalDate firstDayOfTheWeek = date.with(WeekFields.of(Locale.FRANCE).getFirstDayOfWeek());
System.out.println(firstDayOfTheWeek);
LocalDate lastDayOfTheWeek = firstDayOfTheWeek.plusDays(6);
System.out.println(lastDayOfTheWeek);
System.out.println();
System.out.println("USA:");
firstDayOfTheWeek = date.with(WeekFields.of(Locale.US).getFirstDayOfWeek());
System.out.println(firstDayOfTheWeek);
lastDayOfTheWeek = firstDayOfTheWeek.plusDays(6);
System.out.println(lastDayOfTheWeek);
}
}
输出:
France:
2017-02-27
2017-03-05
USA:
2017-03-05
2017-03-11
WeekFields.ISO.getFirstDayOfWeek()
的文档说:
获取一周中的第一天。
一周中的第一天因文化而异。例如,美国使用 星期日,而法国和 ISO-8601 标准使用星期一。这种方法 使用标准 DayOfWeek 枚举返回第一天。
从 modern date-time API 中详细了解 java.time
,Trail: Date Time*。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。
答案 3 :(得分:0)
感谢@ BarrySW19和@ john16384,这是工作方法:
private String formatDate(List<Activity> activities) {
Calendar calendar = Calendar.getInstance(Locale.UK);
Date date = activities.get(activities.size() - 1).getDate();
calendar.setTime(date);
calendar.set(Calendar.DAY_OF_WEEK, calendar.getFirstDayOfWeek());
String output = "" + calendar.get(Calendar.DAY_OF_MONTH) + " "
+ calendar.getDisplayName(Calendar.MONTH, Calendar.SHORT, Locale.UK);
calendar.add(Calendar.DAY_OF_YEAR, 6);
output += " - " + calendar.get(Calendar.DAY_OF_MONTH) + " "
+ calendar.getDisplayName(Calendar.MONTH, Calendar.SHORT, Locale.UK);
return output;
}