所以这听起来很简单,只需在java中查看日期和日期,看看是否在同一天使用系统的日历时间。我可以这样做,这可能是一个可能在这里重复多次的问题。
但我的问题是如何像网络星期一那样。假设我有一个计划,每年在网络星期一,他需要将商店的价格降低70%或将折扣设定为70%。 (这实际上是我的目标)我应该使用java日历吗?我能猜到哪一个。但是我应该怎么做呢?我不能只检查我们现在的那一天是否与27-11-2017相同,因为在2018年它不是在27-11-2018。那我该如何计算或检查呢?
是否可以使用具有年度活动的API,以及人们可以发送请求以接收所请求的年度活动的日期?就像我注意到谷歌日历API,但这只适用于你自己制作的日历。我不打算为我自己添加每个年度活动。
我做了这个方法,检查它是否是CyberMonday,它的主要目的是什么。就在这时,我每年都坚持做。我怎样才能使这一年正确?
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;
}
}
答案 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_Paulo
或Europe/Berlin
)。
避免使用3个字母的缩写(例如CST
或PST
),因为它们是ambiguous and not standard。
您可以致电ZoneId.getAvailableZoneIds()
获取可用时区列表(并选择最适合您系统的时区)。