我以前从未使用过JodaTime,但回答这个问题,如何获取一个月内的序数工作日。
我尝试了一下,并想出了这个丑陋的代码来取消设置当天以下的所有字段:
DateTime startOfMonth =
input.withDayOfMonth(1)
.withHourOfDay(0) // there
.withMinuteOfHour(0) // has got to
.withSecondOfMinute(0) // be a shorter way
.withMillisOfSecond(0); // to do this
使用 DateUtils 的 Commons / Lang 等效项将是
Date startOfMonth = DateUtils.truncate(input, Calendar.MONTH);
在 JodaTime 中执行此操作的首选习惯是什么?
您可以使用 roundFloorCopy() 来模仿 DateUtils.truncate
Date truncateMonth = DateUtils.truncate(input, Calendar.MONTH);
-> DateTime truncateMonth = input.dayOfMonth().roundFloorCopy();
Date truncateMinute = DateUtils.truncate(input, Calendar.MINUTE);
-> DateTime truncateMinute = input.minuteOfDay().roundFloorCopy();
Date truncateHourOfDay = DateUtils.truncate(input, Calendar.HOUR_OF_DAY);
-> DateTime truncateHourOfDay = input.hourOfDay().roundFloorCopy()
使用
withMillisOfDay()
方法来缩短语法。
DateTime startOfMonth = input.withDayOfMonth(1).withMillisOfDay(0);
DateMidnight
。
DateTime startOfMonth = new DateTime(new DateMidnight(input.withDayOfMonth(1)));
更新:2013-08-16,作者:JodaStephen:Joda-Time 2.3 版已弃用
DateMidnight
,因为这是一个非常糟糕的类主意。
所以使用:
DateTime startOfMonth = input.withDayOfMonth(1).withTimeAtStartOfDay();
Joda Time 还支持 DateTime
类型中的
withFields方法。这也可以用于创建简短的语法:
new DateTime().withDayOfMonth(1).withFields(new LocalTime(0, 0));
在生产代码中,
withFields
的参数应分解为常量。