我想找回一个月四五周的日子。 例如,如果我将输入作为“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,那就太棒了
答案 0 :(得分:2)
首先,您必须明确“月份周”的含义。第1周是否包含本月的第一天?是这样,周末什么时候结束,周日?星期六?
或者第一周是包含第一个星期一的那个?第一个星期天?
TemporalAdjuster
java.time类包含用于操作日期时间对象以生成另一个的接口TemporalAdjuster
。
TemporalAdjusters
类(注意复数's')提供了几种实现。一个是dayOfWeekInMonth
来回答诸如“今年三月的第二个星期二”之类的问题。
仔细阅读该调整员的课程文档。
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." );
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,
完成。
答案 1 :(得分:1)
这是解决方案
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();
}
}