0

我正在开发一个应用程序,它会持续监控用户的身体活动和不活动水平。我试图找出提供日期的一周的开始和结束日期。例如,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;
}

注意:我不得不提到,作为参数的列表是每周分组的所有活动

但是,使用这种方法时,当该人不使用应用程序(即未登录 -> 应用程序停止监视)并且文本标签可能看起来像这样 在此处输入图像描述 (例如,本周只有一个活动)时,就会出现问题

请问有什么建议吗?

4

4 回答 4

3

就像这样做一样简单:

calendar.set(Calendar.DAY_OF_WEEK, calendar.getFirstDayOfWeek());

一周的第一天被认为是什么取决于所Locale使用的。

要获得一周的最后一天,请执行以下操作:

calendar.add(Calendar.DAY_OF_YEAR, 6);
于 2017-03-11T21:33:51.443 回答
2

java.time

旧的日期时间 API(java.util日期时间类型及其格式类型SimpleDateFormat等)已过时且容易出错。建议完全停止使用它并切换到java.time现代日期时间 API *

使用java.time现代 API 的解决方案:

对于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 VV 的建议):

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 枚举返回第一天。

Trail: Date Time了解更多关于java.time现代日期时间 API *的信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,则可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到 Java 6 和 7。如果您正在为 Android 项目和 Android API 工作level 仍然不符合 Java-8,请检查Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

于 2021-05-17T22:44:11.923 回答
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);
}
于 2017-03-11T21:40:39.647 回答
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;
}
于 2017-03-11T23:55:53.510 回答