获取java中当前月份的第一个日期
我正在尝试到达日期和开始日期,其中获取java中当前月份的第一个日期,java,calendar,Java,Calendar,我正在尝试到达日期和开始日期,其中ToDate将有以前的日期,FromDate将有当前月份的第一个日期。一月份将是2013年1月1日,以此类推。如何正确获取当月的第一个日期?我做不到 today.add(Calendar.DAY_OF_MONTH, -1); java.util.Date previousDay=today.getTime(); ToDate = sdfFile1.format(newjava.sql.Date(previousDay.getTime())); today.add
ToDate
将有以前的日期,FromDate
将有当前月份的第一个日期。一月份将是2013年1月1日,以此类推。如何正确获取当月的第一个日期?我做不到
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()));
试一试
已更新():
tl;博士
如何正确获取当月的第一个日期
或者
或者
java.time
Java8及更高版本中的框架取代了旧的Java.util.Date/.Calendar类。旧的类已经被证明是麻烦、混乱和有缺陷的。避开它们
time框架的灵感来自于非常成功的库,由项目定义、扩展,并在中进行了解释
LocalDate
对于仅限日期的值(不含时间),请使用LocalDate
类。虽然LocalDate
没有指定的时区,但我们必须指定一个时区以确定诸如“今天”之类的日期。例如,巴黎新的一天比蒙特勒尔早
时区对于确定今天的日期至关重要。在任何特定的时刻,世界各地的日期都因地区而异。省略时区意味着JVM的当前时区将自动应用于确定当前日期。JVM中的任何代码都可以在运行时更改默认值,因此您正在流沙上行走。显式指定所需/预期时区比隐式依赖当前默认时区更好
以大陆/地区
的格式指定,例如,或太平洋/奥克兰
。切勿使用3-4个字母的缩写,如EST
或IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)
在代码中,首先我们确定在特定时区中看到的今天的日期
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:America/Montreal,今天是:2015-11-08,本月初是2015-11-01
或者,也可以使用。出于您的目的,您可以在类中找到方便的实现(注意复数s
)
ZoneDateTime
如果您需要一天中的某个时间,请记住,00:00:00.000
并不总是一天中的第一个时刻,因为夏令时(DST)和其他可能的异常情况。因此,让java.time确定一天中第一个时刻的正确时间
ZonedDateTime zdt = firstOfCurrentMonth.atStartOfDay ( zoneId );
2015-11-01T00:00-04:00[美国/蒙特利尔]
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,& 该项目现已启动,建议迁移到类 要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是 从哪里获得java.time类
- ,及以后
- 内置的
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
- 更高版本的Android捆绑包实现了java.time类
- 对于早期的Android,该项目采用了ThreeTen Backport(如上所述)。看
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、、和。Joda Time 如果我正确理解了这个问题,那么使用joda时间就可以很容易地完成
LocalDate fromDate = new LocalDate().withDayOfMonth(1);
LocalDate toDate = new LocalDate().minusDays(1);
如果您还希望将时间设置为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);
}
}
您可以使用以下工具轻松在线检查,无需编译:
非常有魅力!
//更正:output=02-01-2018您可以使用java8中的方法返回月份的第一天:
LocalDate firstDay = LocalDate.now().withDayOfMonth(1);
System.out.println(firstDay); // 2019-09-01
我愚蠢的解决方案。但这对我来说很有用:为了得到一个日期(以后可以在JPA中使用),我做了
- 我使用当前日期LocalDate.now()
- 将其移动到每月的第一天withDayOfMonth(1)
- 在startofday()将其移动到当天的sart,以消除小时和分钟
- 并通过将时区转换为具有“正确”区域偏移的瞬间来处理时区问题
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();
}
可能的重复项请注意,
小时
、分钟
、秒
和毫秒
将具有您创建日历
或日期
实例时的值。您可能希望将这些值设置为0,例如c.set(Calendar.MINUTE,0)
。另请参见此答案,它没有时间问题:这是我的首选答案,因为它将时间设置为0。从月的第一天(0:00)到前一天(0:00)。有时你可能想设置toDate=newlocaldate()
直到最后一个午夜(今天的0:00h)。我很好奇为什么你没有提到使用临时调整器。firstDayOfMonth()
@DeanSchulze临时调整器
方法也很有效。如果您想要月底,那么当然可以使用ChronoField.day\u of u month
方法来指定某个月的某一天,因为调用Instant.with(TemporalAdjusters.firstDayOfMonth()时,我们不会轻易指定该月的某一天)
@tak3shi使用ZonedDateTime
而不是Instant
。@BasilBourque您已经有了三个如何正确获取当月第一个日期的示例,但也可以使用LocalDate.now()完成。withDayOfMonth(1)
2018年02月07日几乎不是当月的第一天?SimpleDa
LocalDate firstOfCurrentMonth = today.with( TemporalAdjusters.firstDayOfMonth() ) ;
ZonedDateTime zdt = firstOfCurrentMonth.atStartOfDay ( zoneId );
LocalDate fromDate = new LocalDate().withDayOfMonth(1);
LocalDate toDate = new LocalDate().minusDays(1);
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);
}
}
public static String getCurrentMonthFirstDate(){
Calendar c = Calendar.getInstance();
c.set(Calendar.DAY_OF_MONTH, 1);
DateFormat df = new SimpleDateFormat("MM-dd-yyyy");
//System.out.println(df.format(c.getTime()));
return df.format(c.getTime());
}
LocalDate firstDay = LocalDate.now().withDayOfMonth(1);
System.out.println(firstDay); // 2019-09-01
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);
...
Date startOfMonth = Date.from(LocalDate.now().withDayOfMonth(1).atStartOfDay().toInstant(ZoneOffset.UTC));
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();
}