Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中如何确定通过周数和日数(周)的日期_Java_Date_Calendar_Gregorian Calendar_Date Parsing - Fatal编程技术网

java中如何确定通过周数和日数(周)的日期

java中如何确定通过周数和日数(周)的日期,java,date,calendar,gregorian-calendar,date-parsing,Java,Date,Calendar,Gregorian Calendar,Date Parsing,我需要通过传递这些参数来获取日期 年 周数(一个月内),即1,2,3,4,5 日数(一周内)0(星期日)至6(星期六) 月 我在Calendar类中查找构造函数,但不包含这些参数。要从年、周数和星期几创建日期,请使用java.util.Calendar实例: Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR, 2017); cal.set(Calendar.WEEK_OF_YEAR, 26);

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

  • 周数(一个月内),即1,2,3,4,5
  • 日数(一周内)0(星期日)至6(星期六)

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

    要从年、周数和星期几创建日期,请使用
    java.util.Calendar
    实例:

    Calendar cal = Calendar.getInstance();
            cal.set(Calendar.YEAR, 2017);
            cal.set(Calendar.WEEK_OF_YEAR, 26);
            cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
    
    要从
    日历
    转换为
    java.util.Date

    Date date = cal.getTime();
    
    要将
    Date
    转换为
    java.time.LocalDateTime
    使用:

    LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
    

    要从年、周数和星期几创建日期,请使用
    java.util.Calendar
    实例:

    Calendar cal = Calendar.getInstance();
            cal.set(Calendar.YEAR, 2017);
            cal.set(Calendar.WEEK_OF_YEAR, 26);
            cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
    
    要从
    日历
    转换为
    java.util.Date

    Date date = cal.getTime();
    
    要将
    Date
    转换为
    java.time.LocalDateTime
    使用:

    LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
    

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

    我不知道你怎么计算你一个月的周数。我假设第一周从月的第一天开始,持续7天(因此第二周从月的第8天开始,第五周从月的第29天开始)。如果您的计数不同,请参阅

    我建议这种方法:

    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
    
    如果需要
    日期
    格雷戈里安日历
    ,例如,对于无法更改的旧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

    尽管你的标签我同意Joe C的评论,但你应该更喜欢现代Java日期和时间API(也称为
    Java.time
    或JSR-310),而不是过时很久的
    日历和朋友。现代类对程序员更友好,使用起来也更方便,它们带来的惊喜更少,生成的代码更清晰、更自然(至少当你习惯了流畅的风格时),如果你出现错误,就更容易调试

    我不知道你怎么计算你一个月的周数。我假设第一周从月的第一天开始,持续7天(因此第二周从月的第8天开始,第五周从月的第29天开始)。如果您的计数不同,请参阅

    我建议这种方法:

    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
    
    如果需要
    日期
    格雷戈里安日历
    ,例如,对于无法更改的旧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
    
    第二个生成一个等于相同时间点的
    GregoriaCalendar

    因为,您需要定义一周从哪一天开始,以及第一周必须考虑多少天

    例如,ISO-8601标准考虑:

    • 星期一是一周的第一天
    • 第一周的最小天数:标准将第一周计算为至少需要4天
    月份分为多个时段,每个时段从定义的每周第一天开始。如果当月最早的时间段少于最小天数,则称为周
    0
    ,如果至少有最小天数,则称为周
    1

    根据您如何定义这些,您可以得到不同的结果。考虑2017年7月的日历:

         July 2017
    Su Mo Tu We Th Fr Sa
                       1
     2  3  4  5  6  7  8
     9 10 11 12 13 14 15
    16 17 18 19 20 21 22
    23 24 25 26 27 28 29
    30 31
    
    如果我们考虑ISO的定义,我们就有:

    • 第零周-2017-07-01至2017-07-02
    • 第一周:2017-07-03至2017-07-09
    • 第2周:2017-07-10至2017-07-16
    • 第3周:2017-07-17至2017-07-22
    • 第4周:2017-07-23至2017-07-30
    • 第5周:2017-07-31
    如果我们把第一天作为星期日,第一周的最小天数为1,我们就有:

    • 第一周:2017-07-01
    • 第2周:2017-07-02至2017-07-08
    • 第3周:2017-07-09至2017-07-15
    • 第4周:2017-07-16至2017-07-21
    • 第5周:2017-07-22至2017-07-29
    • 第6周:2017-07-30至2017-07-31

    由于已经发布了一个带有
    Calendar
    的解决方案,我将使用新的API编写一个解决方案。如果使用<强> java 8 < /强>,请考虑使用这更容易

    如果使用的是JavaAs,则需要定义一周从哪一天开始,以及第一周必须考虑的天数

    例如,ISO-8601标准考虑:

    • 星期一是一周的第一天
    • 第一周的最小天数:标准将第一周计算为至少需要4天
    月份分为多个时段,每个时段从定义的每周第一天开始。如果当月最早的时间段少于最小天数,则称为周
    0
    ,如果至少有最小天数,则称为周
    1

    根据您如何定义这些,您可以得到不同的结果。考虑2017年7月的日历:

         July 2017
    Su Mo Tu We Th Fr Sa
                       1
     2  3  4  5  6  7  8
     9 10 11 12 13 14 15
    16 17 18 19 20 21 22
    23 24 25 26 27 28 29
    30 31
    
    如果我们考虑ISO的定义,我们就有:

    • 第零周-2017-07-01至2017-07-02
    • 第一周:2017-07-03至2017-07-09
    • 第2周