[英]Get first date of current month in java
我正在尝试往返日期,其中ToDate
将具有上一个日期,而FromDate
将具有当月的第一个日期。 对于 1 月,它将是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() )
或者…
LocalDate.now().withDayOfMonth( 1 )
或者…
YearMonth.now().atDay( 1 )
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/Casablanca
或Pacific/Auckland
。 切勿使用EST
或IST
等 3-4 个字母的缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
在代码中,首先我们确定特定时区中的今天日期。
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
LocalDate today = LocalDate.now ( zoneId );
然后我们将日期调整为第一天。
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:America/Montreal 今天是:2015-11-08,本月的第一天是 2015-11-01
或者,使用TemporalAdjuster
。 出于您的目的,您将在TemporalAdjusters
类(注意复数s
)中找到方便的实现,特别是firstDayOfMonth
。
LocalDate firstOfCurrentMonth = today.with( TemporalAdjusters.firstDayOfMonth() ) ;
ZonedDateTime
如果您需要一天中的某个时间,请记住,由于夏令时 (DST) 和其他异常情况, 00:00:00.000
并不总是一天中的第一个时刻。 所以让 java.time 确定一天中第一时刻的正确时间。
ZonedDateTime zdt = firstOfCurrentMonth.atStartOfDay ( zoneId );
2015-11-01T00:00-04:00[美国/蒙特利尔]
java.time框架内置于 Java 8 及更高版本中。 这些类取代了麻烦的旧日期时间类,例如java.util.Date
、 Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle 教程。 并在 Stack Overflow 上搜索许多示例和解释。 规范是JSR 310 。
从哪里获得 java.time 类?
ThreeTen-Extra项目通过附加类扩展了 java.time。 该项目是未来可能添加到 java.time 的试验场。 您可以在这里找到一些有用的类,例如Interval
、 YearWeek
、 YearQuarter
等等。
Calendar date = Calendar.getInstance();
date.set(Calendar.DAY_OF_MONTH, 1);
乔达时间
如果我正确理解了这个问题,可以使用 joda time 轻松完成
LocalDate fromDate = new LocalDate().withDayOfMonth(1);
LocalDate toDate = new LocalDate().minusDays(1);
您可以使用withDayOfMonth(int dayOfMonth)
方法返回一个月的第一天:
LocalDate firstDay = LocalDate.now().withDayOfMonth(1);
System.out.println(firstDay); // 2019-09-01
如果您还希望将时间设置为 0,则代码为:
import java.util.*;
import java.text.*;
public class DateCalculations {
public static void main(String[] args) {
Calendar aCalendar = Calendar.getInstance();
aCalendar.set(Calendar.DATE, 1);
aCalendar.set(Calendar.HOUR_OF_DAY, 0);
aCalendar.set(Calendar.MINUTE, 0);
aCalendar.set(Calendar.SECOND, 0);
Date firstDateOfCurrentMonth = aCalendar.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss zZ");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
String dayFirst = sdf.format(firstDateOfCurrentMonth);
System.out.println(dayFirst);
}
}
您无需编译即可轻松在线查看: http ://www.browxy.com/
为了得到一个日期(以后可以在 JPA 中使用),我做了
Date startOfMonth = Date.from(LocalDate.now().withDayOfMonth(1).atStartOfDay().toInstant(ZoneOffset.UTC));
import java.util.Date;
import java.text.SimpleDateFormat;
...
Date currentMonth = new Date();
String yyyyMM = new SimpleDateFormat("yyyyMM").format(currentMonth);
Date firstDateOfMonth = new SimpleDateFormat("yyyyMM").parse(yyyyMM);
...
我的愚蠢解决方案。 但这对我有用:D
在 Java 8 中,您可以使用:
LocalDate date = LocalDate.now(); //2020-01-12
date.withDayOfMonth(1); //2020-01-01
日期的月份的第一天:
public static Date firstDayOfMonth(Date d) {
Calendar calendar = new GregorianCalendar();
calendar.setTime(d);
calendar.set(Calendar.DAY_OF_MONTH, 1);
return calendar.getTime();
}
使用 JodaTime 包的另一种方法取决于您的要求,可以使用 Zone 它,也可以删除
import org.joda.time.DateTimeZone;
DateTime previousMonthStartDate = DateTime.now().minusMonths(1).withDayOfMonth(1).toDateTime(DateTimeZone.forID("Asia/Calcutta"));
String previousMonthStDate = previousMonthStartDate.toString("yyyy-MMMM-dd");
System.out.println(previousMonthStDate);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.