确定日期是否是Java中的网络星期一

时间:2017-07-31 14:40:34

标签: java calendar google-calendar-api

所以这听起来很简单,只需在java中查看日期和日期,看看是否在同一天使用系统的日历时间。我可以这样做,这可能是一个可能在这里重复多次的问题。

但我的问题是如何像网络星期一那样。假设我有一个计划,每年在网络星期一,他需要将商店的价格降低70%或将折扣设定为70%。 (这实际上是我的目标)我应该使用java日历吗?我能猜到哪一个。但是我应该怎么做呢?我不能只检查我们现在的那一天是否与27-11-2017相同,因为在2018年它不是在27-11-2018。那我该如何计算或检查呢?

是否可以使用具有年度活动的API,以及人们可以发送请求以接收所请求的年度活动的日期?就像我注意到谷歌日历API,但这只适用于你自己制作的日历。我不打算为我自己添加每个年度活动。

我做了这个方法,检查它是否是Cyber​​Monday,它的主要目的是什么。就在这时,我每年都坚持做。我怎样才能使这一年正确?

public static void CyberMonday() {
    //Check here if it's Cybermonday or if it's day after cybermonday.
    if(Server.getCalendar().getYMD().toString().equals("2017/11/27") ) {
        Config.CYBER_MONDAY = true; 
        updateCyberMondayOnWebsite();
    } else {
        Config.CYBER_MONDAY = false;
    }
}

1 个答案:

答案 0 :(得分:0)

您可以使用Java 8的new java.time API

如果您使用的是 Java< = 7 ,则可以使用ThreeTen Backport,这是Java 8新日期/时间类的绝佳后端。对于 Android ,有ThreeTenABP(更多关于如何使用它here)。

以下代码适用于两者。 唯一的区别是包名称(在Java 8中为java.time,在ThreeTen Backport(或Android的ThreeTenABP)中为org.threeten.bp),但类和方法名称是相同的

您可以使用LocalDate课程来获得指定年份的感恩节(假设它在美国,所以这是11月的第四个星期四),然后在下一个星期一之后。 我还使用TemporalAdjusters类,它具有内置方法来获取这些日期。代码是:

// get Cyber Monday of a specified year
public LocalDate getCyberMonday(int year) {
    // Thanksgiving: fourth Thursday of November
    // get first day of November
    LocalDate d = LocalDate.of(year, 11, 1)
        // get the fourth Thursday
        .with(TemporalAdjusters.dayOfWeekInMonth(4, DayOfWeek.THURSDAY));

    // next monday after Thanksgiving
    return d.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
}

有了这个,您可以获得任何一年的网络星期一:

// get Cyber Monday for year 2017
LocalDate cyberMonday = getCyberMonday(2017);

所以你可以与其他日期进行比较:

// checking if today is Cyber Monday
boolean isCyberMonday = cyberMonday.equals(LocalDate.now());

如果您要检查的日期是String,则必须先解析它(使用DateTimeFormatter)然后进行比较。 我正在以一种通用的方式做:解析String,从中获取年份并与当年的网络星期一进行比较。

在此示例中,日期与示例(2017/11/27)的格式相同:

String input = "2017/11/27";
// parse the input (in year/month/day format)
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy/MM/dd");
LocalDate parsedDate = LocalDate.parse(input, fmt);

// compare the parsed date with the Cyber Monday of the same year
LocalDate cyberMonday = getCyberMonday(parsedDate.getYear());
boolean isCyberMonday = cyberMonday.equals(parsedDate);

您必须更改模式以匹配您的输入。有关日期模式的详细信息,请查看DateTimeFormatter javadoc

PS: LocalDate.now()将在系统的默认时区中获取当前日期。如果您想保证它在特定时区获得当前日期,您可以执行LocalDate.now(ZoneId.of("America/New_York"))之类的操作。

请注意,我使用America/New_York作为时区:API使用IANA timezones names(始终采用Region/City格式,如America/Sao_PauloEurope/Berlin)。 避免使用3个字母的缩写(例如CSTPST),因为它们是ambiguous and not standard

您可以致电ZoneId.getAvailableZoneIds()获取可用时区列表(并选择最适合您系统的时区)。