Mat*_* B. 40 java calendar jodatime
您将如何重写下面的方法,该方法将返回下个月的第一天,org.joda.time
包装在Joda-Time中?
public static Date firstDayOfNextMonth() {
Calendar nowCal = Calendar.getInstance();
int month = nowCal.get(Calendar.MONTH) + 1;
int year = nowCal.get(Calendar.YEAR);
Calendar cal = Calendar.getInstance();
cal.clear();
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, month);
cal.set(Calendar.DAY_OF_MONTH, 1);
Date dueDate = new Date(cal.getTimeInMillis());
return dueDate;
}
Run Code Online (Sandbox Code Playgroud)
leo*_*loy 45
LocalDate today = new LocalDate();
LocalDate d1 = today.plusMonths(1).withDayOfMonth(1);
Run Code Online (Sandbox Code Playgroud)
有点容易和清洁,不是吗?:-)
更新:如果您想要返回日期:
return new Date(d1.toDateTimeAtStartOfDay().getMillis());
Run Code Online (Sandbox Code Playgroud)
但我强烈建议你避免将纯DATE类型(即日历中的一天,没有时间信息)与DATETIME类型混合,特别是"物理"日期时间类型,因为它是可怕的java.util.Date
.它有点像转换为整数和浮动类型,你必须小心.
del*_*ego 21
我假设你想要返回一个Date对象,所以:
public static Date firstDayOfNextMonth() {
MutableDateTime mdt = new MutableDateTime();
mdt.addMonths(1);
mdt.setDayOfMonth(1);
mdt.setMillisOfDay(0); // if you want to make sure you're at midnight
return mdt.toDate();
}
Run Code Online (Sandbox Code Playgroud)
Bas*_*que 15
这是我对这个问题的看法,使用Joda-Time 2.3.
通常,您应该使用Joda-Time类的不可变版本.几乎所有方法都返回一个新的实例DateTime
而不是修改现有实例.简化事物,并实现自动线程安全.
使用较新的方法withTimeAtStartOfDay()
而不是将时间设置为零.由于夏令时(DST)和其他异常,在某些时区的某些天,没有午夜或00:00:00的时间.
要将Joda-Time DateTime
实例转换为java.util.Date实例,只需调用toDate
method即可.在Date上不需要构造函数.
换句话说,如果你有一个java.util.Date并想要一个Joda-Time DateTime,只需将Date传递给DateTime的构造函数以及所需的DateTimeZone
对象.
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
// Usually better to specify a time zone rather than rely on default.
DateTime now = new DateTime( timeZone ); // Or, for default time zone: new DateTime()
DateTime monthFromNow = now.plusMonths(1);
DateTime firstOfNextMonth = monthFromNow.dayOfMonth().withMinimumValue();
DateTime firstMomentOfFirstOfNextMonth = firstOfNextMonth.withTimeAtStartOfDay();
Run Code Online (Sandbox Code Playgroud)
或者,如果你是一个疯子,那么所有字符串都在一行代码中.
DateTime allInOneLine = new DateTime( DateTimeZone.forID( "Europe/Paris" ) ).plusMonths( 1 ).dayOfMonth().withMinimumValue().withTimeAtStartOfDay();
Run Code Online (Sandbox Code Playgroud)
转换为旧的java.util.Date以与其他类/库进行交互.
java.util.Date date = firstMomentOfFirstOfNextMonth.toDate();
Run Code Online (Sandbox Code Playgroud)
转储到控制台......
System.out.println( "now: " + now );
System.out.println( "monthFromNow: " + monthFromNow );
System.out.println( "firstOfNextMonth: " + firstOfNextMonth );
System.out.println( "firstMomentOfFirstOfNextMonth: " + firstMomentOfFirstOfNextMonth );
System.out.println( "allInOneLine: " + allInOneLine );
System.out.println( "date: " + date );
Run Code Online (Sandbox Code Playgroud)
跑的时候......
now: 2014-01-21T02:46:16.834+01:00
monthFromNow: 2014-02-21T02:46:16.834+01:00
firstOfNextMonth: 2014-02-01T02:46:16.834+01:00
firstMomentOfFirstOfNextMonth: 2014-02-01T00:00:00.000+01:00
allInOneLine: 2014-02-01T00:00:00.000+01:00
date: Fri Jan 31 15:00:00 PST 2014
Run Code Online (Sandbox Code Playgroud)
Java 8及更高版本中内置的java.time框架取代了旧的java.util.Date/.Calendar类.受Joda-Time的启发,并打算成为其继任者.
这些新类包括TemporalAdjuster
接口(Tutorial)和一堆实现TemporalAdjusters
(注意复数s
).恰好有我们需要的调节器:firstDayOfNextMonth
.
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
LocalDate today = LocalDate.now ( zoneId );
LocalDate firstOfNextMonth = today.with ( TemporalAdjusters.firstDayOfNextMonth () );
Run Code Online (Sandbox Code Playgroud)
转储到控制台.
System.out.println ( "today: " + today + " | firstOfNextMonth: " + firstOfNextMonth );
Run Code Online (Sandbox Code Playgroud)
今天:2015-12-22 | firstOfNextMonth:2016-01-01
如果您想要日期时间而不是仅限日期,请调整.
ZonedDateTime zdt = firstOfNextMonth.atStartOfDay( zoneId );
Run Code Online (Sandbox Code Playgroud)
如果您需要使用旧的java.util.Date来操作尚未更新到java.time的旧类,请Instant
从ZonedDateTime对象中提取转换.Instant是UTC时间轴上的一个时刻.
java.util.Date date = java.util.Date.from( zdt.toInstant() );
Run Code Online (Sandbox Code Playgroud)
该java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date
,Calendar
,和SimpleDateFormat
.
现在处于维护模式的Joda-Time项目建议迁移到java.time类.
要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.
您可以直接与数据库交换java.time对象.使用符合JDBC 4.2或更高版本的JDBC驱动程序.不需要字符串,不需要课程.java.sql.*
从哪里获取java.time类?
该ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval
,YearWeek
,YearQuarter
,和更多.
在Joda API中有一个方法:
Date date = new LocalDate().plusMonths(1).dayOfMonth().withMinimumValue().toDate();
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你!