【问题标题】:Find start-end date of a week from week number从周数中查找一周的开始日期
【发布时间】:2015-10-14 21:41:24
【问题描述】:

我使用 servlet 和 JSP 构建了一个 Web 应用程序,并在我的 Servlet 中计算周数:

 private int findWeekNumber(String myDate) 
    throws ParseException{
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Date date;
        date = df.parse(myDate);
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        int week = cal.get(Calendar.WEEK_OF_YEAR);
        System.out.println("week number is:" + week);

        return week;
    }

然后我将week 保存到我的数据库中。然后我从我的数据库中检索week。如何从week 获取一周的开始 - 结束日期(周开始是星期一)?假设weekNumber 是 30,我想计算 20/07/2015 - 26/07/2015。同样的功能是here

【问题讨论】:

  • 您可以使用外部库,例如 JodaTime,还是在 Java8 上运行?这可能会简化事情。
  • 我正在运行 Java8。我用 servlet 和 JSP @reto 构建了一个 Web 应用程序

标签: java date java-8


【解决方案1】:

从周数开始:

Calendar cal = Calendar.getInstance();
cal.setTime(date);
int week = cal.get(Calendar.WEEK_OF_YEAR);
int year = cal.get(Calendar.YEAR);

Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(Calendar.YEAR, year);


calendar.set(Calendar.WEEK_OF_YEAR, week);
calendar.set(Calendar.DAY_OF_WEEK, 1);
   // Now get the first day of week.
Date sDate = calendar.getTime();
System.out.println(sDate);

calendar.set(Calendar.WEEK_OF_YEAR, (week));
calendar.set(Calendar.DAY_OF_WEEK, 7);
Date eDate = calendar.getTime();
System.out.println(eDate);

另一种解决方案

IFF - 没有周数

Date date = new Date();
Calendar c = Calendar.getInstance();
c.setTime(date);
int dayOfWeek = c.get(Calendar.DAY_OF_WEEK) - c.getFirstDayOfWeek();
c.add(Calendar.DAY_OF_MONTH, -dayOfWeek);

Date weekStart = c.getTime();
// we do not need the same day a week after, that's why use 6, not 7
c.add(Calendar.DAY_OF_MONTH, 6); 
Date weekEnd = c.getTime();

System.out.println(weekStart);
System.out.println(weekEnd);

【讨论】:

  • 你不使用周数来计算weekstart,weekEnd。 int 变量week 是我计算开始/结束日期的线索。
【解决方案2】:

您可以为此使用Calendar

 Calendar cal = Calendar.getInstance();
 cal.set(Calendar.WEEK_OF_YEAR, week);
 Date yourDate = cal.getTime();

 cal.setTime(yourDate);//Set specific Date of which start and end you want

 Date start,end;

 cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
 start = cal.getTime();//Date of Monday of current week

 cal.add(Calendar.DATE, 6);//Add 6 days to get Sunday of next week
 cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
 end = cal.getTime();//Date of Sunday of current week
 System.out.println(start +" - "+ end);

【讨论】:

  • 但是你不使用周数来计算weekstart,weekEnd。 int 变量week 是我计算开始/结束日期的线索
  • @Nat95 但你也可以使用date。 :) 和week 会告诉你在你一周的 52 个位置中的哪个位置。
  • 星期并不总是从星期一开始,到星期日结束。
  • @TAsk 请原谅我,但我不明白我将如何使用我拥有的线索,即代码中的 int var week(例如 30)
  • 我这么说是因为我将week 保存到我的数据库中。当我检索它时,我想计算开始结束的星期日期。
【解决方案3】:

Java 8 版本

LocalDate week = LocalDate.now().with(ChronoField.ALIGNED_WEEK_OF_YEAR, yourWeekNumber);

LocalDate start = week.with(DayOfWeek.MONDAY);
LocalDate end = start.plusDays(6);
System.out.println(start +" - "+ end);

【讨论】:

  • 两件事:LocalDate#with 不是静态方法,你需要一个 LocalDate 对象(例如LocalDate.of(2015, 1, 1))来调用该方法。正确的结束日期是start.plusDays(6),而不是week.plusDays(6)
  • 谢谢,已调整答案
  • 您需要指定时区。如果省略,则应用 JVM 当前的默认时区。时区对于阻止日期至关重要。例如,巴黎的新一天比蒙特利尔早。
  • 没有更好的解决方案吗?丢弃 LocalDate 实例对我来说不合适。
【解决方案4】:

java.time

java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用,改用modern Date-Time API*

另外,下面引用的是来自home page of Joda-Time的通知:

请注意,从 Java SE 8 开始,用户被要求迁移到 java.time (JSR-310) - JDK 的核心部分,它取代了这个项目。

使用现代日期时间 API java.time 的解决方案:

import java.time.LocalDate;
import java.time.Year;
import java.time.temporal.WeekFields;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        // Test
        int weekNumber = 34;
        System.out.printf("%s - %s%n", getFirstDayOfWeek(weekNumber, Locale.UK),
                getLastDayOfWeek(weekNumber, Locale.UK));
        System.out.printf("%s - %s%n", getFirstDayOfWeek(weekNumber, Locale.US),
                getLastDayOfWeek(weekNumber, Locale.US));
    }

    static LocalDate getFirstDayOfWeek(int weekNumber, Locale locale) {
        return LocalDate
                .of(Year.now().getValue(), 2, 1)
                .with(WeekFields.of(locale).getFirstDayOfWeek())
                .with(WeekFields.of(locale).weekOfWeekBasedYear(), weekNumber);
    }

    static LocalDate getLastDayOfWeek(int weekNumber, Locale locale) {
        return getFirstDayOfWeek(weekNumber, locale).plusDays(6);
    }
}

输出:

2021-08-23 - 2021-08-29
2021-08-15 - 2021-08-21

ONLINE DEMO

请注意,一周的第一天Locale-dependent 例如英国是星期一,美国是星期日。根据ISO 8601 标准,现在是星期一。为了比较,请检查US calendarUK calendar

Trail: Date Time 了解有关现代日期时间 API 的更多信息。


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2019-11-14
    • 2021-10-27
    相关资源
    最近更新 更多