获取java当前月份的第一个日期

45 java calendar

我试图进入和离开ToDate之前的日期,FromDate并将有当月的第一个日期.对于一月它会是1/1/2013等等.如何正确获取当月的第一个日期?我无法做到.

today.add(Calendar.DAY_OF_MONTH, -1);
java.util.Date previousDay=today.getTime();
ToDate = sdfFile1.format(newjava.sql.Date(previousDay.getTime()));
today.add(Calendar.DATE, 1);
java.util.Date nextDay=today.getTime();
FromDate = sdfFile1.format(new java.sql.Date(nextDay.getTime()));
Run Code Online (Sandbox Code Playgroud)

Evg*_*eev 85

尝试

    Calendar c = Calendar.getInstance();   // this takes current date
    c.set(Calendar.DAY_OF_MONTH, 1);
    System.out.println(c.getTime());       // this returns java.util.Date
Run Code Online (Sandbox Code Playgroud)

更新(自Java 8起):

import java.time.LocalDate;
LocalDate todaydate = LocalDate.now();
System.out.println("Months first date in yyyy-mm-dd: " +todaydate.withDayOfMonth(1));
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`HOUR_OF_DAY`、`MINUTE`、`SECOND` 和`MILLISECOND` 将具有它们在您创建`Calendar` 或`Date` 实例时的值。您可能希望将这些值设置为 0,例如 `c.set(Calendar.MINUTE, 0)`。 (2认同)

Bas*_*que 18

TL;博士

如何正确获取当月的第一个日期?

LocalDate.now()
         .with( TemporalAdjusters.firstDayOfMonth() )
Run Code Online (Sandbox Code Playgroud)

要么…

YearMonth.now().atDay( 1 )
Run Code Online (Sandbox Code Playgroud)

要么…

LocalDate.now().with ( ChronoField.DAY_OF_MONTH , 1 )
Run Code Online (Sandbox Code Playgroud)

java.time

Java 8及更高版本中的java.time框架取代了旧的java.util.Date/.Calendar类.旧的课程被证明是麻烦,混乱和有缺陷的.避免他们.

java.time框架的灵感来自于高度成功的Joda-Time库,由JSR 310定义,由ThreeTen-Extra项目扩展,并在教程中进行了解释.

LocalDate

对于仅限日期的值,不使用时间,请使用LocalDate该类.虽然LocalDate没有指定时区,但我们必须指定时区以确定日期,例如"今天".例如,巴黎的新日早些时候比蒙特利尔早.

时区对于确定今天的日期至关重要.对于任何给定的时刻,日期因地区而异.省略时区意味着JVM的当前时区会自动应用于确定当前日期.JVM中的任何代码都可以在运行时更改默认值,因此您可以在移动的沙子上行走.最好明确指定所需/预期的时区,而不是隐含地依赖当前默认值.

指定适当的时区名称,格式continent/region,如America/Montreal,Africa/CasablancaPacific/Auckland.切勿使用3-4字母缩写,例如ESTIST因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!).

ZoneId zoneId = ZoneId.of ( "America/Montreal" );
LocalDate today = LocalDate.now ( zoneId );
LocalDate firstOfCurrentMonth = today.with ( ChronoField.DAY_OF_MONTH , 1 );
Run Code Online (Sandbox Code Playgroud)

转储到控制台.

System.out.println ( "For zoneId: " + zoneId + " today is: " + today + " and first of this month is " + firstOfCurrentMonth );
Run Code Online (Sandbox Code Playgroud)

对于zoneId:今天的美国/蒙特利尔是:2015-11-08,本月的第一个是2015-11-01

或者,使用a TemporalAdjuster.为了您的目的,您将在TemporalAdjusters课堂上找到方便的实现(注意复数s)firstDayOfMonth.

LocalDate firstOfCurrentMonth = today.with( TemporalAdjusters.firstDayOfMonth() ) ;
Run Code Online (Sandbox Code Playgroud)

ZonedDateTime

如果你需要一天的时间,记住,00:00:00.000不是总是因为夏令时(DST),也许还有其他异常现象的一天的第一刻.因此,让java.time确定一天中第一时刻的正确时间.

ZonedDateTime zdt = firstOfCurrentMonth.atStartOfDay ( zoneId );
Run Code Online (Sandbox Code Playgroud)

2015-11-01T00:00-04:00 [美国/蒙特利尔]


关于java.time

java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.

现在处于维护模式Joda-Time项目建议迁移到java.time类.

要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.

从哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval,YearWeek,YearQuarter,和更多.


par*_*lov 7

Calendar date = Calendar.getInstance();
date.set(Calendar.DAY_OF_MONTH, 1);
Run Code Online (Sandbox Code Playgroud)


ank*_*hen 5

乔达时间

如果我正确理解了这个问题,那么使用 joda time 可以很容易地完成

LocalDate fromDate = new LocalDate().withDayOfMonth(1);
LocalDate toDate = new LocalDate().minusDays(1);
Run Code Online (Sandbox Code Playgroud)