下个月的第一天用Java Joda-Time

你将如何重写下面的方法,返回下个月的第一天,在Joda-Time中的org.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; } 
  LocalDate today = new LocalDate(); LocalDate d1 = today.plusMonths(1).withDayOfMonth(1); 

更简单,更清洁,不是吗? 🙂

更新:如果你想返回一个date:

 return new Date(d1.toDateTimeAtStartOfDay().getMillis()); 

但我强烈build议您避免混合使用DATETIMEtypes的纯DATEtypes(即日历中的一天,无时间信息),特别是使用“物理”date时间types,就像可怕的java.util.Date 。 这有点像转换为整数和浮点types,你必须小心。

我假设你想要返回一个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(); } 

乔达时间

这是我使用Joda-Time 2.3解决这个问题的方法。

不可变

通常你应该使用Joda-Time类的不可变版本。 几乎所有的方法都返回一个DateTime的新实例,而不是修改现有的实例。 简化事物,并使自动线程安全。

开始的日

使用withTimeAtStartOfDay()的新方法,而不是将时间设置为零。 由于夏令时(DST)和其他exception情况,在某些时区的某些日子,没有午夜或00:00:00的时间。

转换:juDate↔DateTime

要将Joda-Time DateTime实例转换为java.util.Date实例,只需调用toDate方法即可。 date无需构造函数。

换句话说,如果你有一个java.util.Date并且想要一个Joda-Time DateTime,只需将Date和DateTimeZone对象一起传递给DateTime的构造函数即可。

示例代码

 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(); 

或者,如果你是一个疯子,把所有的string放在一行代码中。

 DateTime allInOneLine = new DateTime( DateTimeZone.forID( "Europe/Paris" ) ).plusMonths( 1 ).dayOfMonth().withMinimumValue().withTimeAtStartOfDay(); 

转换为与其他类/库进行交互的旧java.util.Date。

 java.util.Date date = firstMomentOfFirstOfNextMonth.toDate(); 

转储到控制台…

 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 ); 

当运行…

 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 

java.time

Java 8中内置的java.time框架取代了旧的java.util.Date/.Calendar类。 受Joda-Time启发,并打算成为其继任者。

这些新类包括TemporalAdjuster接口( 教程 )和TemporalAdjusters的一些实现(注意复数forms)。 只需要调整我们需要: firstDayOfNextMonth

 ZoneId zoneId = ZoneId.of ( "America/Montreal" ); LocalDate today = LocalDate.now ( zoneId ); LocalDate firstOfNextMonth = today.with ( TemporalAdjusters.firstDayOfNextMonth () ); 

转储到控制台。

 System.out.println ( "today: " + today + " | firstOfNextMonth: " + firstOfNextMonth ); 

今天:2015-12-22 | firstOfNextMonth:2016-01-01

如果你想要一个date而不是date,请调整。

 ZonedDateTime zdt = firstOfNextMonth.atStartOfDay( zoneId ); 

如果您需要使用旧的java.util.Date来处理尚未更新为java.time的旧类,请从ZonedDateTime对象中提取的Instant中进行转换。 即时是UTC时间线上的一个时刻。

 java.util.Date date = java.util.Date.from( zdt.toInstant() ); 

在Joda API中有一个方法:

 Date date = new LocalDate().plusMonths(1).dayOfMonth().withMinimumValue().toDate(); 

希望能帮助到你!

与以前一样,但也转换为java.util.Date

datefirstDayOfNextMonth =(new LocalDate()。plusMonths(1).withDayOfMonth(1))。toDate();

localDate = new LocalDate()。plusMonths(1).withDayOfMonth(1);

我不知道如果“我”得到的问题是正确的,但这里是我的尝试:D ..就像不加1个月?

 public static Date firstDayOfNextMonth() { LocalDateTime now = LocalDateTime.now(); int year = now.getYear(); int month = now.getMonthValue(); int day = now.getDayOfMonth(); 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; }