获取一周的开始日期和结束日期? 【JAVA]

时间:2017-03-11 21:12:20

标签: java android-calendar android-date java-date java-calendar

我正在开发一款能够持续监控用户身体活动和不活动水平的应用。我想弄清楚提供一个星期的开始和结束日期。例如,3月3日是我提供的日期,我希望得到本周的开始和结束日期 - > 2月27日 - 3月5日。有可能吗?

我正在努力实现以下设计 enter image description here

以下代码我刚刚连接活动列表的最后一个日期和第一个日期(每天创建一个)。

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作为参数是每周分组的所有活动

但是,使用这种方法时,如果该人未使用该应用程序(即未登录 - >该应用程序停止监控)并且文本标签看起来像那样,则会出现问题 enter image description here (例如本周只有一项活动)

有什么建议吗?

4 个答案:

答案 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)

java.time

旧的日期时间 API(java.util 日期时间类型及其格式类型,SimpleDateFormat 等)已经过时且容易出错。建议完全停止使用,改用java.timemodern 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.timeTrail: Date Time*


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow 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;
}