java - java中如何通过周数和日数(Week)来确定日期

标签 java date calendar gregorian-calendar date-parsing

我需要通过传递这些参数来获取日期

  1. 年份
  2. 周数(一个月),即 1、2、3、4、5
  3. 天数(一周)0(星期日)至 6(星期六)
  4. 月份

我在 Calendar 类中查找了构造函数,但不包含这些参数。

最佳答案

尽管你的标签我同意 Joe C 的评论,但你应该更喜欢现代 Java 日期和时间 API(又称为 java.time 或 JSR-310),而不是早已过时的 日历和 friend 。现代类对程序员更友好,更容易使用,它们带来的惊喜更少,导致代码更清晰、更自然(至少当您习惯了流畅的风格时),并且如果您犯了错误,则更容易调试。

我不知道你如何计算一个月中的几周。我假设第一周从该月的第一周开始,持续 7 天(因此第二周从该月的 8 号开始,第五周从该月的 29 号开始)。如果计数不同,请参阅Hugo’s answer .

我建议这个方法:

public static LocalDate weekNoAndDayToDate(Year year, Month month, int weekOfMonth, int dayOfWeek) {
    // find day of week: convert from 0 (Sunday) to 6 (Saturday)
    // to DayOfWeek, from 1 (Monday) to 7 (Sunday)
    DayOfWeek dow;
    if (dayOfWeek == 0) { // Sunday
        dow = DayOfWeek.SUNDAY;
    } else {
        dow = DayOfWeek.of(dayOfWeek);
    }
    return year.atMonth(month)
            .atDay(1)
            .with(TemporalAdjusters.nextOrSame(dow))
            .with(ChronoField.ALIGNED_WEEK_OF_MONTH, weekOfMonth);
}

例如,我们可以这样做

    LocalDate today = weekNoAndDayToDate(Year.of(2017), Month.JULY, 1, 1);

这会产生

2017-07-03

如果您需要 DateGregorianCalendar(例如,对于无法更改的旧 API),请执行以下操作之一:

    Date oldfashiondDateObject
            = Date.from(today.atStartOfDay(ZoneId.systemDefault()).toInstant());
    GregorianCalendar oldfashionedCalendarObject
            = GregorianCalendar.from(today.atStartOfDay(ZoneId.systemDefault()));

在这两种情况下,不同时区的结果都会不同(旧类的固有问题之一)。在我的计算机上,第一个生成的日期

Mon Jul 03 00:00:00 CEST 2017

第二个生成的 GregorianCalendar 等于同一时间点。

关于java - java中如何通过周数和日数(Week)来确定日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44893620/

相关文章:

java - Jmeter CPU 使用率未超过 25%

java - 当我从 Activity 中按后退按钮后如何停止播放音效

javascript:如何隐藏代表过去日期的 DIV/UL?

perl - 给定日期,以 mm/dd/yyyy 为单位查找一年中的星期

android - 最受支持的 Java 日期/时间类

java - 来自抽象类的父类(super class)的模拟字段

java - 为每个请求分配新 session ID 的良好做法?

date - 同步系统时间和日期的批处理文件

android - 如何在 android 中获取 WEEK_OF_YEAR 内的日期列表?

android - android中 GridView 中的不同列名