【问题标题】:Get Start day and End day of a Week? [Java]获取一周的开始日期和结束日期? [爪哇]
【发布时间】:2017-08-02 02:45:42
【问题描述】:

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

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

但是,使用这种方法时,当用户不使用应用程序(即未登录 -> 应用程序停止监控)并且文本标签可能看起来像这样时,就会出现问题 (例如本周只有一项活动)

请给点建议?

【问题讨论】:

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


    【解决方案1】:

    就这么简单:

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

    一周的第一天取决于所使用的Locale。

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

    calendar.add(Calendar.DAY_OF_YEAR, 6);
    

    【讨论】:

    • 谢谢!工作出色!我也添加了我的工作方法作为我的问题的解决方案:)
    【解决方案2】:

    您只需要使用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);
    }
    

    【讨论】:

    • 感谢您的建议。你和@john16384 为我指明了正确的方向。感谢帮助:)
    【解决方案3】:

    java.time

    旧的日期时间 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 枚举返回第一天。

    从Trail: Date Time了解更多关于java.time,modern date-time API*。


    * 出于任何原因,如果您必须坚持使用 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。

    【讨论】:

    • 我相信你的代码会给 ISO 周(周一到周日)。可能希望使用所需语言环境的 WeekFields 对象来为其他周方案获取正确的周数。
    【解决方案4】:

    感谢@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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      • 2018-10-05
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多