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

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.它有点像转换为整数和浮动类型,你必须小心.

  • 对于那些使用`LocalDate`路由的人来说,它看起来像使用LocalDate.toDateMidnight().toDate()是将它转换为Java`Date`对象的最简单方法,时间设置为午夜. (3认同)

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)

  • 这段代码现在已经过时(2014年).(A)Joda-Time的设计者建议不要使用可变类.相反,您可以调用许多返回新的不可变[`DateTime`](http://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html)实例的方法.(B)不再推荐与午夜相关的方法.相反,调用[`withTimeAtStartOfDay`](http://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html#withTimeAtStartOfDay())来获取新的一天的第一时刻.不要将午夜的毫秒设置为零,因为夏令时可能意味着没有这样的午夜时间. (5认同)

Bas*_*que 15

乔达时间

这是我对这个问题的看法,使用Joda-Time 2.3.

不可变

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

开始的日

使用较新的方法withTimeAtStartOfDay()而不是将时间设置为零.由于夏令时(DST)和其他异常,在某些时区的某些天,没有午夜或00:00:00的时间.

转换:juDate↔DateTime

要将Joda-Time DateTime实例转换为java.util.Date实例,只需调用toDatemethod即可.在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.time

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.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,和更多.


ava*_*vaz 6

在Joda API中有一个方法:

Date date = new LocalDate().plusMonths(1).dayOfMonth().withMinimumValue().toDate();
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!