繁体   English   中英

在 java 中获取当月的第一个日期

[英]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));

tl;博士

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

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

或者…

LocalDate.now().withDayOfMonth( 1 )

或者…

YearMonth.now().atDay( 1 )

java.time

Java 8 及更高版本中的java.time框架取代了旧的 java.util.Date/.Calendar 类。 旧的课程已被证明是麻烦的、令人困惑的和有缺陷的。 避开他们。

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

LocalDate

对于没有时间的仅日期值,请使用LocalDate类。 虽然LocalDate没有指定时区,但我们必须指定时区才能确定日期,例如“今天”。 例如,巴黎的新一天比蒙特利尔更早。

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

continent/region格式指定适当的时区名称,例如America/MontrealAfrica/CasablancaPacific/Auckland 切勿使用ESTIST等 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.time框架内置于 Java 8 及更高版本中。 这些类取代了麻烦的日期时间类,例如java.util.DateCalendarSimpleDateFormat

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

要了解更多信息,请参阅Oracle 教程 并在 Stack Overflow 上搜索许多示例和解释。 规范是JSR 310

从哪里获得 java.time 类?

ThreeTen-Extra项目通过附加类扩展了 java.time。 该项目是未来可能添加到 java.time 的试验场。 您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuarter等等

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));
  • 我取当前日期 LocalDate.now()
  • 使用DayOfMonth(1) 将其移至该月的第一天
  • 在StartOfDay() 将它移到当天的sart,以摆脱小时和分钟
  • 并通过将其更改为具有“正确”ZoneOffset 的 Instant 来处理 TimeZone 问题。

奇迹般有效!

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());
}

//更正:输出=02-01-2018 在此处输入图像描述

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM