我正试图获取到日期和从日期,其中 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()));
尝试
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));
如何正确获取当前月份的第一个日期?
LocalDate.now()
.with( TemporalAdjusters.firstDayOfMonth() )
或者...
YearMonth.now().atDay( 1 )
或者...
LocalDate.now().with ( ChronoField.DAY_OF_MONTH , 1 )
Java 8 及以后版本中的 [java.time][1] 框架取代了旧的 java.util.Date/.Calendar 类。旧类已被证明是麻烦、混乱和有缺陷的。请避免使用它们。 java.time 框架受非常成功的 Joda-Time 库启发,由 JSR 310 定义,由 ThreeTen-Extra 项目扩展,并在 Tutorial 中进行了解释。
要获得不含日期时间的纯日期值,请使用 LocalDate
类。虽然 LocalDate
没有指定时区,但我们必须指定时区才能确定 "今天 "这样的日期。例如,巴黎新一天的黎明要早于蒙特利尔。
时区对于确定今天的日期至关重要。在任何特定时刻,世界各地的日期都因时区而异。省略时区意味着在确定当前日期时会自动应用 JVM 的当前时区。JVM 中的任何代码都可以在运行时更改默认时区,因此您只能在变动的沙地上行走。与其隐含地依赖当前默认时区,还不如明确指定您所需/期望的时区。
以 "洲/地区 "的格式指定适当的时区名称,例如美洲/蒙特利尔
、非洲/卡萨布兰卡
或 "太平洋/奥克兰`"。切勿使用 "EST "或 "IST "等3-4个字母的缩写,因为它们**不是真正的时区,没有标准化,甚至不是唯一的(!)。
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
LocalDate today = LocalDate.now ( zoneId );
LocalDate firstOfCurrentMonth = today.with ( ChronoField.DAY_OF_MONTH , 1 );
转到控制台。
System.out.println ( "For zoneId: " + zoneId + " today is: " + today + " and first of this month is " + firstOfCurrentMonth );
对于 zoneId:美国/蒙特利尔今天是:2015-11-08,本月 1 日是 2015-11-01 或者,使用 [
TemporalAdjuster``][2]。您可以在 [
TemporalAdjusters][3]类(注意复数 "s
")中找到方便的实现,特别是 [firstDayOfMonth
][4]。
LocalDate firstOfCurrentMonth = today.with( TemporalAdjusters.firstDayOfMonth() ) ;
如果您需要一天中的时间,请记住,由于夏令时(DST)和其他异常情况,"00:00:00.000 "并不总是一天中的第一个时刻。因此,让 java.time 来确定一天中第一个时刻的正确时间吧。
ZonedDateTime zdt = firstOfCurrentMonth.atStartOfDay ( zoneId );
2015-11-01T00:00-04:00[America/Montreal]
关于 java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,如
java.util.Date
、Calendar
、&SimpleDateFormat
。 现在处于维护模式的Joda-Time项目建议迁移到java.time类。 要了解更多信息,请参阅Oracle 教程。还可以搜索 Stack Overflow,了解更多示例和解释。规范为 JSR 310。 从哪里获取 java.time 类?
- Java SE 8、Java SE 9及更高版本
- 内置。
- 捆绑实现的标准 Java API 的一部分。
- Java 9 增加了一些次要功能和修正。
- Java SE 6 和 Java SE 7
- 在ThreeTen-Backport中,大部分 java.time 功能被回移植到 Java 6 & 7。
- 安卓
- 后期版本的安卓系统捆绑了 java.time 类的实现。
- 对于早期的 Android 系统,ThreeTenABP 项目改编了ThreeTen-Backport(如上所述)。请参阅 如何使用 ThreeTenABP... 。 ThreeTen-Extra项目用附加类扩展了 java.time。该项目是将来可能添加到 java.time 的试验场。您可能会在这里找到一些有用的类,如
Interval
、YearWeek
、YearQuarter
和 more。