在Java中获取日期范围内的所有星期五
我最近遇到一个任务,我必须把所有的星期五都安排在一个日期范围内。我写了一小段代码,并惊讶地看到一些奇怪的行为
下面是我的代码:
public class Friday {
public static void main(String[]args){
String start = "01/01/2009";
String end = "12/09/2013";
String[] startTokens = start.split("/");
String[] endTokens = end.split("/");
Calendar startCal = new GregorianCalendar(Integer.parseInt(startTokens[2]),Integer.parseInt(startTokens[1])-1,Integer.parseInt(startTokens[0]));
Calendar endCal = new GregorianCalendar(Integer.parseInt(endTokens[2]),Integer.parseInt(endTokens[1])-1, Integer.parseInt(endTokens[0]));
int startYear = Integer.parseInt(startTokens[2]);
int endYear = Integer.parseInt(endTokens[2]);
int startWeek = startCal.get(Calendar.WEEK_OF_YEAR);
int endWeek = endCal.get(Calendar.WEEK_OF_YEAR);
Calendar cal = new GregorianCalendar();
cal.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
// cal.setMinimalDaysInFirstWeek(7);
ArrayList<String> main = new ArrayList<String>();
while(startYear <= endYear ){
cal.set(Calendar.YEAR, startYear);
System.out.println(cal.getMinimalDaysInFirstWeek());
if(startYear == endYear){
main.addAll(getFridays(startWeek, endWeek, cal));
}
else{
main.addAll(getFridays(startWeek, 52, cal));
startWeek = 1;
}
startYear =startYear +1;
}
for(String s: main){
System.err.println(s);
}
}
public static ArrayList<String> getFridays(int startWeek, int endWeek, Calendar cal){
ArrayList<String> fridays = new ArrayList<String>();
while(startWeek <= endWeek){
cal.set(Calendar.WEEK_OF_YEAR, startWeek);
fridays.add(cal.getTime().toString());
startWeek = startWeek+1;
}
return fridays;
}
}
现在当我运行代码时,我注意到2011年的星期五不见了。经过一些调试和在线浏览之后,我发现Calendar.WEEK_OF_YEAR
是特定于语言环境的,我必须使用setMinimalDaysInFirstWeek(7)
来修复它
因此,在上面的代码中取消了相关行的注释
根据我现在的理解,一年中的第一周应该从一年中的整整一周开始
例如,2010年1月1日是星期五。但它不应该出现在结果中,因为我将它配置为治疗从1月3日开始的那一周。但现在我仍然认为1月1日是星期五
我很困惑。有人能解释为什么会这样吗
这些Stackoverflow文章对我有些帮助:
# 1 楼答案
与Lamma Date一起:
# 2 楼答案
此代码将打印星期五之前的所有日期
# 3 楼答案
tl;博士
爪哇。时间
其他答案已经过时了。旧爪哇。util。日期/。在Java8和更高版本中,新的java.time框架取代了日历类。Joda Time library非常优秀,一直在维护,甚至受到了java的启发。时间但Joda Time团队建议转向java。只要方便,时间就到
LocalDate
爪哇。时间类包括^{} ,用于只包含日期的值,不包含一天中的时间或时区。见Tutorial
首先解析输入字符串以获取
LocalDate
对象在您自己的代码中,如果输入错误,请尝试捕获异常。并验证
stop
确实与start
相同或更晚TemporalAdjusters
爪哇。时间框架包括^{} 接口,用于转换日期时间值。例如,getting the next or same Friday表示任何特定日期。在开始日期,调用^{} 并从类^{} 传递
TemporalAdjuster
的预定义实现(注意复数形式s
)。见Tutorial转储到控制台
关于java。时间
java.time框架内置于Java8及更高版本中。这些类取代了麻烦的legacy日期时间类,如^{} 、^{} 、&^{}
目前位于maintenance mode的Joda-Time项目建议迁移到java.time类
要了解更多信息,请参阅Oracle Tutorial。并在Stack Overflow中搜索许多示例和解释。规范是JSR 310
使用与JDBC 4.2或更高版本兼容的JDBC driver,您可以交换java。时间对象直接与数据库连接。不需要字符串或java。sql.*上课
在哪里可以获得java。时间课
ThreeTen-Extra项目扩展了java。有额外课程的时间。这个项目是java未来可能增加的一个试验场。时间你可以在这里找到一些有用的类,比如^{} 、^{} 、^{} 和more
# 4 楼答案
这里是一个基于Java-8的新流特性的解决方案,使用my libraryTime4J(v4.18或更高版本):
顺便说一句,Java-9将提供类似的解决方案(但具有唯一的结束日期边界),另请参见enhancement-issue
# 5 楼答案
首先,我不想花几个星期的时间。将日历设置为范围的开始,计算出道琼斯指数,然后递增到下一个星期五,然后简单地循环增加7天,直到到达范围的末尾
实际上,因为你总是只向前看,所以应该是这样的:
是的,就像那样
好的,事实上,在Java 8中,它是:
一定很喜欢新的约会课程!!当然,lambda会进一步浓缩这一点
# 6 楼答案
下面是一个更简单的方法,使用奇妙的http://www.joda.org/joda-time/库:
最后,在fridays数组中有fridays。简单
或者,如果你想加快速度,一旦你有了一个星期五,你可以从使用天切换到使用周: