获取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,以消除小时和分钟
  • 并通过将时区转换为具有“正确”区域偏移的瞬间来处理时区问题
在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();  
}

可能的重复项请注意,
小时
分钟
毫秒
将具有您创建
日历
日期
实例时的值。您可能希望将这些值设置为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();  
}