【问题标题】:java find days in different weeks in monthjava查找月份不同周的天数
【发布时间】:2016-12-05 10:19:20
【问题描述】:

我想检索一个月的四/五周内的日子。 例如,如果我输入为“2016 年 12 月” - 那么我应该得到如下所示的日期

第一周 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

我尝试使用calendar,但代码太多 - 如果您有任何已知的解决方案,请提出建议。

我正在使用 java 8 - 所以如果可以使用 Localdate ,那就太好了

【问题讨论】:

  • 如果您展示您迄今为止所尝试的内容,您可能会获得帮助。就目前而言,您要求为您完成工作。
  • 明确你如何定义一周。

标签: java date calendar


【解决方案1】:

定义“每月的星期”

首先,您必须清楚“一周中的一周”是什么意思。第 1 周是否包含该月的第一天?是这样吗,星期天什么时候结束?星期六?

还是第 1 周包含第一个星期一?第一个星期日?

TemporalAdjuster

java.time 类包括接口TemporalAdjuster,用于操作日期时间对象以生成另一个对象。

TemporalAdjusters 类(注意复数“s”)提供了几种实现。一种是dayOfWeekInMonth,回答“今年三月的第二个星期二”等问题。

仔细阅读该调节器的课程文档。

ISO 8601

ISO 8601 标准定义了日期时间值的合理文本表示。我建议你坚持使用这些而不是自己编造。

所以,不要使用Dec 2016,而是使用2016-12

java.time 类默认使用 ISO 8601 格式。比如YearMonth类可以直接解析生成2016-12等值。

YearMonth ym = YearMonth.of( 2016 , 12 );

…或者,为了清楚起见,使用Month 枚举对象…

YearMonth ym = YearMonth.of( 2016 , Month.DECEMBER );

调用toString 生成ISO 8601 格式的字符串。

ym:toString(): 2016-12

YearMonth ym = YearMonth.parse( "2016-12" );

LocalDate 类表示没有时间和时区的仅日期值。 YearMonth 对象可以在该月的第一天和最后一天为您提供 LocalDate

示例

如果您将一周中的一周定义为从 1 日开始到周日结束,那么请执行以下操作。逐日递增,打印每个月的日期数。测试每个人的星期几,看看它是否是星期的最后一天(根据您自己的定义),因此需要换行。

如果绝对必要,您可以优化此代码。而且您可能需要清理它以不打印最后的逗号。但它会让你朝着正确的方向前进。

YearMonth ym = YearMonth.parse( "2016-12" );
LocalDate firstOfMonth = ym.atDay( 1 ); 
LocalDate lastOfMonth = ym.atEndOfMonth();
int nthWeek = 1;

LocalDate ld = firstOfMonth;
while( ! ld.isAfter( lastOfMonth ) ) {
    System.out.print( ld.getDayOfMonth() + ", " );
    if( ld.getDayOfWeek().equals( DayOfWeek.SUNDAY ) ) {
        System.out.println( "" ); // Wrap to next line.
    }
    ld = ld.plusDays( 1 );  // Setup for next loop.
}

System.out.println( "\nDone." );

live code in IdeOne.com

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,

完成。

【讨论】:

    【解决方案2】:

    这就是解决办法

    package mypackage;
    
    import java.time.DayOfWeek;
    import java.time.LocalDate;
    import java.util.ArrayList;
    import java.util.List;
    import java.time.temporal.TemporalAdjusters;
    import java.time.temporal.ChronoUnit;
    
    
    public class DataUtil {
    
        public static void main(String[] args) {
            List<String> weeks = new ArrayList<>();
    
            LocalDate firstDayOfMonth = LocalDate.of(2016, 12 , 1);
            LocalDate firstWeekendOfMonth= firstDayOfMonth.with( TemporalAdjusters.firstInMonth(DayOfWeek.SUNDAY));
    
            long firstWeekGap = ChronoUnit.DAYS.between(firstDayOfMonth , firstWeekendOfMonth) ;
    
            String daysInWeek = buildDaysInWeek(1,12,2016);
            weeks.add("{" + daysInWeek +"}");
    
    
            for ( int i = ((int)firstWeekGap +1 )  ; i <= 31 ; i = i+7  )
            {
                daysInWeek = buildDaysInWeek(i,12,2016);
                weeks.add("{" + daysInWeek +"}");
    
            }
    
            System.out.println(  " weeks " + weeks);
    
    
        }
    
        private static String buildDaysInWeek(int date,int month, int year)
        {
            StringBuffer daysInWeek = new StringBuffer();
    
            LocalDate startDate = LocalDate.of(year , month , date);
    
            daysInWeek.append(startDate.getDayOfMonth());
    
            LocalDate endOfWeek = startDate ;
            while (  endOfWeek.getDayOfWeek() != DayOfWeek.SATURDAY )
            {
                endOfWeek = endOfWeek.plusDays(1);
                daysInWeek.append(",");
                daysInWeek.append(endOfWeek.getDayOfMonth());
            }
    
            return daysInWeek.toString();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      • 2022-07-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-03
      • 2018-12-19
      相关资源
      最近更新 更多