下个月的第一天用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; }