java获取给定月份和给定年份的第一个日期和最后一个日期
我正在尝试获取给定月份和年份的第一个日期和最后一个日期。我使用以下代码以yyyyMMdd格式获取最后一个日期。但无法获取此格式。然后我希望开始日期的格式相同。我还在做这个。有人能帮我修复下面的代码吗java获取给定月份和给定年份的第一个日期和最后一个日期,java,date,calendar,Java,Date,Calendar,我正在尝试获取给定月份和年份的第一个日期和最后一个日期。我使用以下代码以yyyyMMdd格式获取最后一个日期。但无法获取此格式。然后我希望开始日期的格式相同。我还在做这个。有人能帮我修复下面的代码吗 public static java.util.Date calculateMonthEndDate(int month, int year) { int[] daysInAMonth = { 29, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 3
public static java.util.Date calculateMonthEndDate(int month, int year) {
int[] daysInAMonth = { 29, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int day = daysInAMonth[month];
boolean isLeapYear = new GregorianCalendar().isLeapYear(year);
if (isLeapYear && month == 2) {
day++;
}
GregorianCalendar gc = new GregorianCalendar(year, month - 1, day);
java.util.Date monthEndDate = new java.util.Date(gc.getTime().getTime());
return monthEndDate;
}
public static void main(String[] args) {
int month = 3;
int year = 2076;
final java.util.Date calculatedDate = calculateMonthEndDate(month, year);
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
format.format(calculatedDate);
System.out.println("Calculated month end date : " + calculatedDate);
}
换成
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
String formattedDate = format.format(calculatedDate);
System.out.println("Calculated month end date : " + formattedDate);
更多细节
另一种方法
package com.shashi.mpoole;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class DateMagic {
public static String PATTERN = "yyyyMMdd";
static class Measure {
private int month;
private int year;
private Calendar calendar;
public Measure build() {
calendar = Calendar.getInstance();
calendar.set(year, month, 1);
return this;
}
public Measure(int year, int month) {
this.year(year);
this.month(month);
}
public String min() {
return format(calendar.getActualMinimum(Calendar.DATE));
}
public String max() {
return format(calendar.getActualMaximum(Calendar.DATE));
}
private Date date(GregorianCalendar c) {
return new java.util.Date(c.getTime().getTime());
}
private GregorianCalendar gc(int day) {
return new GregorianCalendar(year, month, day);
}
private String format(int day) {
SimpleDateFormat format = new SimpleDateFormat(PATTERN);
return format.format(date(gc(day)));
}
public void month(int month) {
this.month = month - 1;
}
public void year(int year) {
this.year = year;
}
}
public static void main(String[] args) {
Measure measure = new Measure(2020, 6).build();
System.out.println(measure.min());
System.out.println(measure.max());
}
}
要获取开始日期,请执行以下操作
GregorianCalendar gc = new GregorianCalendar(year, month-1, 1);
java.util.Date monthEndDate = new java.util.Date(gc.getTime().getTime());
System.out.println(monthEndDate);
Calendar.getInstance().getActualMinimum(Calendar.DAY_OF_MONTH);
(注意:开始日期中的天=1)
对于格式化的
SimpleDateFormat format = new SimpleDateFormat(/////////add your format here);
System.out.println("Calculated month end date : " + format.format(calculatedDate));
请在每月最后一天尝试以下代码:-
Calendar c = Calendar.getInstance();
c.set(2012,3,1); //------>
c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
System.out.println(sdf.format(c.getTime()));
只需使用Calendar类即可。您应该为月份变量指定您想要的月份
Calendar gc = new GregorianCalendar();
gc.set(Calendar.MONTH, month);
gc.set(Calendar.DAY_OF_MONTH, 1);
Date monthStart = gc.getTime();
gc.add(Calendar.MONTH, 1);
gc.add(Calendar.DAY_OF_MONTH, -1);
Date monthEnd = gc.getTime();
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
System.out.println("Calculated month start date : " + format.format(monthStart));
System.out.println("Calculated month end date : " + format.format(monthEnd));
虽然不是OP问题的确切答案,但以下方法将以Java 8+LocalDate实例的形式给出当前月份的第一个和最后一个日期
public static LocalDate getCurrentMonthFirstDate() {
return LocalDate.ofEpochDay(System.currentTimeMillis() / (24 * 60 * 60 * 1000) ).withDayOfMonth(1);
}
public static LocalDate getCurrentMonthLastDate() {
return LocalDate.ofEpochDay(System.currentTimeMillis() / (24 * 60 * 60 * 1000) ).plusMonths(1).withDayOfMonth(1).minusDays(1);
}
旁注:使用LocalDate.ofEpochDay(…)
而不是LocalDate.now()
可以大大提高性能。此外,使用每日毫秒表达式而不是结束值(即86400000
)的性能更好。我最初认为后者会比表达式P表现得更好
为什么这个答案:即使这不是OP问题的正确答案,我仍然在这里回答,因为当我搜索“java 8 get month start date”时,Google显示了这个问题:)java.time.YearMonth
方法::atDay
&::atEndOfMonth
Java8()中的新版本提供了相应的命令
恰当命名的类表示一年中的一个月,没有任何特定的日期或时间。从那里我们可以询问每月的第一天和第二天
YearMonth yearMonth = YearMonth.of( 2015, 1 ); // January of 2015.
LocalDate firstOfMonth = yearMonth.atDay( 1 );
LocalDate last = yearMonth.atEndOfMonth();
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,& 该项目现已启动,建议迁移到类 要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是 您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*
类
从哪里获得java.time类
- 然后
- 内置的李>
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
-
- 更高版本的Android捆绑包实现了java.time类
- 对于早期Android(第一天:
GregorianCalendar gc = new GregorianCalendar(year, month-1, 1); java.util.Date monthEndDate = new java.util.Date(gc.getTime().getTime()); System.out.println(monthEndDate);
月的最后一天:Calendar.getInstance().getActualMinimum(Calendar.DAY_OF_MONTH);
Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH);
那么,您得到了什么结果?为什么要从
(日历.getTime()的结果转换为日期
,然后创建一个新的长
)?您是否可以切换到使用Joda Time,这将使所有这些变得更加整洁?您的答案应该包含对代码的解释以及它如何解决问题的描述。仅供参考,像、日期
java.text.simpleDataFormat等麻烦的旧日期时间类现在已被java 8和更高版本.Se中内置的类所取代e.FYI,像,
这样非常麻烦的旧日期时间类现在被内置在Java8和更高版本中的类所取代。参见.FYI,像,java.text.simpledteformat
和GregorianCalendar
这样非常麻烦的日期时间类现在被类所取代s内置于Java 8及更高版本中。请参阅。这无法正常工作。请尝试通过第6个月,即6月。您将获得第一个日期2020-06-01和结束日期2020-07-01。谢谢@Sadda Hussain。问题已修复。java.text.simpledteformat
public static Date[] getMonthInterval(Date data) throws Exception { Date[] dates = new Date[2]; Calendar start = Calendar.getInstance(); Calendar end = Calendar.getInstance(); start.setTime(data); start.set(Calendar.DAY_OF_MONTH, start.getActualMinimum(Calendar.DAY_OF_MONTH)); start.set(Calendar.HOUR_OF_DAY, 0); start.set(Calendar.MINUTE, 0); start.set(Calendar.SECOND, 0); end.setTime(data); end.set(Calendar.DAY_OF_MONTH, end.getActualMaximum(Calendar.DAY_OF_MONTH)); end.set(Calendar.HOUR_OF_DAY, 23); end.set(Calendar.MINUTE, 59); end.set(Calendar.SECOND, 59); //System.out.println("start "+ start.getTime()); //System.out.println("end "+ end.getTime()); dates[0] = start.getTime(); dates[1] = end.getTime(); return dates; }