Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获取一年的开始和结束日期?_Java_Date - Fatal编程技术网

Java 如何获取一年的开始和结束日期?

Java 如何获取一年的开始和结束日期?,java,date,Java,Date,我必须使用JavaDate类来解决这个问题(它与我无法控制的东西接口) 如何获取一年的开始和结束日期,然后遍历每个日期?您可以使用Jodatime,如本线程所示 此外,您还可以使用公历,一次移动一天,如下所示 还有一条建议:先搜索它 // suppose that I have the following variable as input int year=2011; Calendar calendarStart=Calendar.getInstance();

我必须使用Java
Date
类来解决这个问题(它与我无法控制的东西接口)


如何获取一年的开始和结束日期,然后遍历每个日期?

您可以使用Jodatime,如本线程所示

此外,您还可以使用公历,一次移动一天,如下所示

还有一条建议:先搜索它

    // suppose that I have the following variable as input
    int year=2011;
    Calendar calendarStart=Calendar.getInstance();
    calendarStart.set(Calendar.YEAR,year);
    calendarStart.set(Calendar.MONTH,0);
    calendarStart.set(Calendar.DAY_OF_MONTH,1);
    // returning the first date
    Date startDate=calendarStart.getTime();

    Calendar calendarEnd=Calendar.getInstance();
    calendarEnd.set(Calendar.YEAR,year);
    calendarEnd.set(Calendar.MONTH,11);
    calendarEnd.set(Calendar.DAY_OF_MONTH,31);

    // returning the last date
    Date endDate=calendarEnd.getTime();
要进行迭代,应使用calendar对象并递增day\u of\u month变量


希望对您有所帮助

我假设您有Date类实例,您需要根据Date类实例查找当前年份的第一个日期和最后一个日期。您可以为此使用Calendar类。使用提供的日期类实例构造日历实例。将月和日字段分别设置为0和1,然后使用getTime()方法返回表示一年中第一天的Date类实例。你们可以用同样的方法来寻找年底

Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2014);
cal.set(Calendar.DAY_OF_YEAR, 1);    
Date start = cal.getTime();

//set date to last day of 2014
cal.set(Calendar.YEAR, 2014);
cal.set(Calendar.MONTH, 11); // 11 = december
cal.set(Calendar.DAY_OF_MONTH, 31); // new years eve

Date end = cal.getTime();

//Iterate through the two dates 
GregorianCalendar gcal = new GregorianCalendar();
gcal.setTime(start);
while (gcal.getTime().before(end)) {
    gcal.add(Calendar.DAY_OF_YEAR, 1);
    //Do Something ...
}
    Date date = new Date();
    System.out.println("date: "+date);
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);

    System.out.println("cal:"+cal.getTime());

    cal.set(Calendar.MONTH, 0);
    cal.set(Calendar.DAY_OF_MONTH, 1);

    System.out.println("cal new: "+cal.getTime());

您可以使用ApacheCommonsLang项目,它有一个类

它们提供了一个迭代器,您可以给Date对象一个迭代器

但我强烈建议按照其他答案的建议使用日历类

Calendar cal = Calendar.getInstance();//getting the instance of the Calendar using the factory method
we have a get() method to get the specified field of the calendar i.e year

int year=cal.get(Calendar.YEAR);//for example we get 2013 here 

cal.set(year, 0, 1); setting the date using the set method that all parameters like year ,month and day
Here we have given the month as 0 i.e Jan as the month start 0 - 11 and day as 1 as the days starts from 1 to30.

Date firstdate=cal.getTime();//here we will get the first day of the year

cal.set(year,11,31);//same way as the above we set the end date of the year

Date lastdate=cal.getTime();//here we will get the last day of the year

System.out.print("the firstdate and lastdate here\n");
这里的GregorianCalendar创建是毫无意义的。事实上,仔细查看Calendar.java源代码可以发现Calendar.getInstance()已经给出了一个GregorianCalendar实例

问候,,
Nicolas

更新:Joda时间库现在处于维护模式,其团队建议迁移到java.Time类。看到正确的答案了吗

时区 其他答案忽略了时区这一关键问题

乔达时间 避免使用众所周知的麻烦的java.util.date类进行日期时间工作。而是使用Joda Time或java.Time。根据互操作性的需要转换为j.u.Date对象

DateTimeZone zone = DateTimeZone.forID( "America/Montreal" ) ;
int year = 2015 ;
DateTime firstOfYear = new DateTime( year , DateTimeConstants.JANUARY , 1 , 0 , 0 , zone ) ;
DateTime firstOfNextYear = firstOfYear.plusYears( 1 ) ;
DateTime firstMomentOfLastDayOfYear = firstOfNextYear.minusDays( 1 ) ;
转换为
java.util.Date
根据需要转换为j.u.Date

java.util.Date d = firstOfYear.toDate() ;
java.time 使用Java 8及更高版本中内置的库。具体地说,是课程和课程

如果需要添加时间信息,可以使用任何可用的
LocalDate
LocalDateTime
转换,如

lastDay.atStartOfDay(); // 2015-12-31T00:00

如果您要查找单行表达式,我通常使用以下方法:

new SimpleDateFormat("yyyy-MM-dd").parse(String.valueOf(new java.util.Date().getYear())+"-01-01")

比Srini的答案有所改进。
使用
日历。getActualMaximum
确定一年中的最后日期

Calendar cal = Calendar.getInstance();

calDate.set(Calendar.DAY_OF_YEAR, 1);
Date yearStartDate = calDate.getTime();

calDate.set(Calendar.DAY_OF_YEAR, calDate.getActualMaximum(Calendar.DAY_OF_YEAR));
Date yearEndDate = calDate.getTime();

一年中的第一天和最后一天

import java.util.Calendar
import java.text.SimpleDateFormat

val parsedDateInt = new SimpleDateFormat("yyyy-MM-dd")

val cal2 = Calendar.getInstance()
cal2.add(Calendar.MONTH, -(cal2.get(Calendar.MONTH)))
cal2.set(Calendar.DATE, 1)
val firstDayOfYear = parsedDateInt.format(cal2.getTime)


cal2.add(Calendar.MONTH, (11-(cal2.get(Calendar.MONTH))))
cal2.set(Calendar.DATE, cal2.getActualMaximum(Calendar.DAY_OF_MONTH))
val lastDayOfYear = parsedDateInt.format(cal2.getTime)
java.time.YearMonth
如何获取特定年份和月份的第一个日期和最后一个日期

下面是使用类的代码

YearMonth
java.time
包中的最后一个类,在Java8中引入

publicstaticvoidmain(字符串[]args){
int year=2021;//您可以传递任何年份值,如20202021。。。
int month=6;//您可以传递月份的任何值,如1,2,3。。。
YearMonth YearMonth=YearMonth.of(年,月);
LocalDate firstOfMonth=yearMonth.atDay(1);
LocalDate lastOfMonth=yearMonth.atEndOfMonth();
System.out.println(第一个月);
系统输出打印项次(最后一个月);
}
看这个

2021-06-01

2021-06-30



日期已取消分配。改用日历。那么,
日历
不是一个选项吗@斯塔斯:这不是真的。一堆不推荐使用的方法并不会使整个类不推荐使用。@Stas:相应的方法不推荐使用,而不是类本身。@Stas:药物不好。不要这样做。
Date
Calendar
都过时了,设计也很糟糕。改用。啊,我没想到你可以在日历和日期之间转换!你不能在他们之间转换;日期表示时间上的一个瞬间,而日历则告诉您该瞬间在特定系统中的表示方式。可以使用
cal.set(Calendar.MONTH,Calendar.defect)等常量来改进此代码啊,我没想到你可以在日历和日期之间转换!请你解释一下你的密码好吗?目前这没有多大帮助。这对非闰年有效吗?还是应该手动更正?请记住,有些年份有365天,有些年份有366天。我不应该用那种方法。回答得好。我建议始终将所需/预期的时区传递给
LocalDate.now(ZoneId)
,而不是隐式地依赖JVM的当前默认时区,该时区可以在运行时随时更改
LocalDate.now(ZoneId.of(“America/Montreal”)
同样,始终将
ZoneId
传递给
atStartOfDay
方法,而不是隐式依赖JVM默认值
lastDay.atStartOfDay(ZoneID.of(“America/Montreal”)
这些可怕的旧遗留类多年前就被现代的java.time类取代了。建议在2018年使用它们是一个糟糕的建议。这些糟糕的日期时间类在几年前被JSR310中定义的java.time类所取代。建议在2019年使用它们是一个糟糕的建议。请参阅中的现代解决方案。这是一种做您正在做的事情的美丽方式。问题是关于一年中的第一天和最后一天。你正朝着正确的方向前进,但问题是关于一年中的第一天和最后一天,而不是一个月。您可以修改此答案,将
Year
类与
YearMonth
结合使用,方法是:
Year.of(2021).atMonth(Month.一月).atDay(1)
Year.of(2021).atMonth(Month.一月).atEndOfMonth()
。或使用。
new SimpleDateFormat("yyyy-MM-dd").parse(String.valueOf(new java.util.Date().getYear())+"-01-01")
Calendar cal = Calendar.getInstance();

calDate.set(Calendar.DAY_OF_YEAR, 1);
Date yearStartDate = calDate.getTime();

calDate.set(Calendar.DAY_OF_YEAR, calDate.getActualMaximum(Calendar.DAY_OF_YEAR));
Date yearEndDate = calDate.getTime();
import java.util.Calendar
import java.text.SimpleDateFormat

val parsedDateInt = new SimpleDateFormat("yyyy-MM-dd")

val cal2 = Calendar.getInstance()
cal2.add(Calendar.MONTH, -(cal2.get(Calendar.MONTH)))
cal2.set(Calendar.DATE, 1)
val firstDayOfYear = parsedDateInt.format(cal2.getTime)


cal2.add(Calendar.MONTH, (11-(cal2.get(Calendar.MONTH))))
cal2.set(Calendar.DATE, cal2.getActualMaximum(Calendar.DAY_OF_MONTH))
val lastDayOfYear = parsedDateInt.format(cal2.getTime)
val instance = Calendar.getInstance()
                instance.add(Calendar.YEAR,-1)

 val prevYear = SimpleDateFormat("yyyy").format(DateTime(instance.timeInMillis).toDate())

val firstDayPreviousYear = DateTime(prevYear.toInt(), 1, 1, 0, 0, 0, 0)

val lastDayPreviousYear = DateTime(prevYear.toInt(), 12, 31, 0, 0, 0, 0)