当前位置: 首页 > 知识库问答 >
问题:

“这是一个月的第三个星期四吗?”-Java库?

淳于坚壁
2023-03-14

我有几十个积压的请求在处理中,比如

'I need this functionality to run on the third Thursday of every month, and the first Wednesday of every other month...'

我已经有了一个每天都在运行的函数,我只需要将:isThirdSundayOfMonth(date)位附加到end。

考虑公历和时区的细微差别,我花的时间越少,我的生活就越好。

有人知道简化这种计算的Java库吗?没有xml配置或框架或任何东西。只有一个。Jar和一个文档化的、可读的API将是完美的。

任何帮助都将不胜感激。

共有2个答案

通宾白
2023-03-14

所有与日期和时间相关的事物的标准库是Joda time。采用它并清除所有标准java类,比如DateCalendar,等等。

这会让你的生活更好。

至于“我如何利用乔达的时间来找到这个月的第三个星期四”,已经有了一个答案。我建议使用提问者发布的代码,然后回答“现在是本月的第三个星期四吗?”

LocalDate today = new LocalDate();
if (today.equals(calcDayOfWeekOfMonth(DateTimeConstants.THURSDAY, 3, today))) {
    // do special third-Thursday processing here
}
程彭祖
2023-03-14

Java-8(新标准):

LocalDate input = LocalDate.now(); // using system timezone
int ordinal = 3;
DayOfWeek weekday = DayOfWeek.SUNDAY;

LocalDate adjusted = 
  input.with(TemporalAdjusters.dayOfWeekInMonth(ordinal, weekday));
boolean isThirdSundayInMonth = input.equals(adjusted);

在Joda Time(流行的第三方库)中:

LocalDate input = new LocalDate(); // using system timezone
int ordinal = 3;
int weekday = DateTimeConstants.SUNDAY;

LocalDate start = new LocalDate(input.getYear(), input.getMonthOfYear(), 1);
LocalDate date = start.withDayOfWeek(weekday);
LocalDate adjusted = (
  date.isBefore(start)) 
  ? date.plusWeeks(ordinal) 
  : date.plusWeeks(ordinal - 1);
boolean isThirdSundayInMonth = input.equals(adjusted);

使用java。util。Gregorianalendar(旧标准):

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
GregorianCalendar input = new GregorianCalendar();
int ordinal = 3;
int weekday = Calendar.SUNDAY;

GregorianCalendar start =
    new GregorianCalendar(input.get(Calendar.YEAR), input.get(Calendar.MONTH), 1);
int dow = start.get(Calendar.DAY_OF_WEEK); // Sun=1, Mon=2, ...
int delta = (weekday - dow);
if (delta < 0) {
    delta += 7;
}
start.add(Calendar.DAY_OF_MONTH, delta + (ordinal - 1) * 7);
String comp1 = sdf.format(input.getTime());
String comp2 = sdf.format(start.getTime());
boolean isThirdSundayInMonth = comp1.equals(comp2);

即使使用最丑的库,解决方案也是可能的;-)我使用了字符串比较来消除任何时区效应或一天中的时间部分,包括毫秒。仅基于年、月和月几的字段比较也是一个好主意。

使用Time4J(我自己的第三方库):

PlainDate input = 
  SystemClock.inLocalView().today(); // using system timezone
Weekday weekday = Weekday.SUNDAY;

PlainDate adjusted = 
  input.with(PlainDate.WEEKDAY_IN_MONTH.setToThird(weekday));
boolean isThirdSundayInMonth = input.equals(adjusted);
 类似资料:
  • 我试图弄清楚如何确定特定的星期一是给定月份的第一个、第二个、第三个还是第四个星期一。我已经弄清楚了如何使用LocalDate类获取下一个星期一和月中的一周。 在上面的例子中,代码获取下一个星期一及其所在的星期。星期是二月的第二周,但那个星期一不是第二个星期一,而是第一个星期一。如果您有任何帮助,我们将不胜感激。

  • 问题内容: 我想获取特定月份/年份中第一个星期一的日期。 我有的: 我基本上有两个int变量,一个代表年份,一个代表月份。 我想要的是: 我想知道本月的第一个星期一,最好是一个int或Integer值。 例如: 我有2014年和1月(1月),这个月的第一个星期一是6号,所以我想返回6。 问题: 我以为可以做到这一点,但是在设置日历(仅提供年和月)时已经遇到了麻烦。此外,我不确定如何使用返回实际的月

  • 我想知道特定月份/年份的第一个星期一的日期。 我所拥有的: 我基本上有两个int变量,一个代表年份,一个代表月份。 我想要的是: 我想知道这个月的第一个星期一,最好是整数或整数值。 例如: 我有2014年和1月,这个月的第一个星期一是6号,所以我想返回6号。 问题: 我原以为我可以用做到这一点,但我在设置日历时遇到了问题,因为只有年份和月份可用。此外,我不知道如何使用返回月份/年份的第一个星期一。

  • 我在这里找到了这个方法: 我想要类似的功能,比如: 有人能帮我更换什么吗?以…为特点。

  • 问题内容: 我对此有些挣扎。 我想设置日历为: 2012年2月的第三个星期一。 而且我找不到使用Java进行此操作的任何方法。 例如,如果我想将日历设置为2011年圣诞节,则可以通过以下方式轻松实现: 但是我对于如何设置它(比如说2012年阵亡将士纪念日)感到困惑,那是5月的最后一个星期一。这是我的代码,但显然是错误的,因为我根本无法假设5月的最后一个星期一将在那年5月的第4周: 关于如何以编程方

  • 问题内容: 我正在尝试编写这样的日历功能 是整数(1、2、3 …),$ day是一天(Sun,Mon,…)或数字,以较容易的一个为准。方向有些混乱,因为它进行了不同的计算。 举个例子 它使用默认值,并获得5月的第一个星期日,即2009-05-03。如果我们打电话 ,它将返回5月的第二个最后一个星期日,即2009-05-24。 问题答案: 也许可以使其更快。。。 代码非常有趣。 请注意,前进1表示反