在java中获取当前月份的第一个日期tl;博士java.time关于 java.time

2022-08-31 16:01:02

我正在尝试到达和离开日期,其中将有上一个日期,并将具有当前月份的第一个日期。对于一月份来说,它将是等等。如何正确获取当前月份的第一个日期?我做不到。ToDateFromDate1/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()));

答案 1

尝试

    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

更新(自 Java 8 起):

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

答案 2

tl;博士

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

LocalDate.now()
         .with( TemporalAdjusters.firstDayOfMonth() )

或。。。

LocalDate.now().withDayOfMonth( 1 )

或。。。

YearMonth.now().atDay( 1 )

java.time

Java 8 及更高版本中的 java.time 框架取代了旧的 java.util.Date/。日历类。旧的阶级被证明是麻烦的,令人困惑的和有缺陷的。避免它们。

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

LocalDate

对于不带时间的纯日期值,请使用该类。虽然没有指定的时区,但我们必须指定一个时区才能确定诸如“今天”之类的日期。例如,巴黎的新一天比蒙特利尔更早到来。LocalDateLocalDate

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

以 的格式指定适当的时区名称,例如 美国/蒙特利尔非洲/卡萨布兰卡或 。切勿使用3-4个字母的缩写,例如或因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。continent/regionPacific/AucklandESTIST

在代码中,首先我们确定在特定时区中看到的今天日期。

ZoneId zoneId = ZoneId.of ( "America/Montreal" );
LocalDate today = LocalDate.now ( zoneId );

然后,我们将月份的某一天调整为第 1 天。

LocalDate firstOfCurrentMonth = today.with ( ChronoField.DAY_OF_MONTH , 1 );

或者,更简单地说:

LocalDate firstOfCurrentMonth = today.withDayOfMonth( 1 ) ;

转储到控制台。

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

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

或者,使用时间调整器。出于您的目的,您将在TemporalAdjusters类(注意复数)中找到方便的实现,特别是firstDayOfMonths

LocalDate firstOfCurrentMonth = today.with( TemporalAdjusters.firstDayOfMonth() ) ;

ZonedDateTime

如果您需要一天中的某个时间,请记住,由于夏令时 (DST) 和其他异常情况,这并不总是一天中的第一个时刻。因此,让java.time确定一天中第一个时刻的正确时间。00:00:00.000

ZonedDateTime zdt = firstOfCurrentMonth.atStartOfDay ( zoneId );

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


关于 java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧日期时间类,如java.util.DateCalendarSimpleDateFormat

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

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

从哪里获取 java.time 类?

ThreeTen-Extra 项目通过其他类扩展了 java.time。这个项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuarter


推荐