在我的程序中,我有一堆表示日期的字符串,看起来像这样:
String someDate1 = "abcd-2020-02-19t10:23:31.180z";
String someDate2 = "xyz-2020-02-22t10:03:31.111z";
String someDate2 = "blablabla-2020-06-15t11:13:31.181z";
让我们以“某个日期1”为例,我已经设法修剪了这些字符串,所以我最终只有日期,例如:
System.out.println(someDate1.substring(someDate1.length() - 24).substring(0, 19));
输出:
2020-02-19t10:23:31
现在,我想确定输出的这个日期是否早于七天。
假设我将上面的字符串保存在一个列表中,所以我只想知道我的约会时间是否超过一周,比如:
public static void main(String[] args) {
String someDate1 = "abcd-2020-02-19t10:23:31.180z";
List<String> datesList = new ArrayList<>();
datesList.add(someDate1);
...//adding others too
datesList.forEach(date -> {
if (isDateOlder(date)) {
System.out.println(date + " - this is more than 7 days old, it has been more than a week!");
}
else {
System.out.println(date + " - it has NOT been more than a week since this date!");
}
});
}
static boolean isDateOlder(String date) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss");
String afterTrimming = date.substring(date.length() - 24).substring(0, 19).replace("t", "-");
try {
Date afterFormatParse = formatter.parse(afterTrimming);
LocalDate weekAgo = LocalDate.now().minusDays(7); //cool thing you can do, but i'm not using it
System.out.println("a week ago : " + weekAgo); //it seems useful but i don't really use it because I saw I can't compare "Date" with LocalDate
long rn = new Date().toInstant().toEpochMilli();
long weekInMillis = 604800000;
long oneWeekAgo = rn - weekInMillis;
if (afterFormatParse.toInstant().toEpochMilli() <= oneWeekAgo) {
return true;
}
else {
return false;
}
} catch (ParseException e) {
e.printStackTrace();
}
}
底线是,它是有效的,但这似乎非常幼稚/浪费,我相信有一个更聪明的方法。。。所以基本上我的主要问题是:
很遗憾,LocalDate没有“toDate()”方法,所以你可以在需要的时候比较这两种方法。最后,我在一个变量中使用了“固定历元”来表示一周,这很幼稚。我想知道你们是否有一种更漂亮的方法来表示日期减去LocalDate提供的一周,同时,还有一种相互比较的方法?
>
注意:我也尝试过使用iSeav(),如下所示:
后格式化解析。toInstant()。isBefore(LocalDate.now()。但是不能这样做,因为“LocalDate.now().minusDays(7)”是LocalDate类型,而不是即时类型,当使用Date时,我不再有“.minusDays(7)”功能
注2:实际上,我的字符串有时以“add vvd sfsf-…”开头或者更多这就是为什么我要从头开始修剪
谢谢。
2020-02-19t10:23:31.180z
采用标准的ISO 8601日期格式,由Java8 Time API原生支持,因此无需使用自定义格式模式。
因此,要检查过去的日期是否超过7天,直到小数秒,您可以这样做:
static boolean isDateOlder(String dateStr) {
Instant date = Instant.parse(dateStr.substring(dateStr.indexOf('-') + 1));
Instant weekAgo = ZonedDateTime.now().minusDays(7).toInstant();
return date.isBefore(weekAgo);
}
如果要忽略时间部分和时区偏移(仅比较日期部分),可以这样做:
static boolean isDateOlder(String dateStr) {
LocalDate date = LocalDate.parse(dateStr.substring(dateStr.indexOf('-') + 1),
DateTimeFormatter.ISO_DATE_TIME);
LocalDate weekAgo = LocalDate.now().minusDays(7);
return date.isBefore(weekAgo);
}
要将输入中的UTC时区偏移量(例如,Z
)调整为本地时区,然后比较纯日期(如果时区转换跨越午夜),可以这样做:
static boolean isDateOlder(String dateStr) {
LocalDate date = Instant.parse(dateStr.substring(dateStr.indexOf('-') + 1))
.atZone(ZoneId.systemDefault())
.toLocalDate();
LocalDate weekAgo = LocalDate.now().minusDays(7);
return date.isBefore(weekAgo);
}
或者更宽松地支持除Z
以外的时区:
static boolean isDateOlder(String dateStr) {
LocalDate date = ZonedDateTime.parse(dateStr.substring(dateStr.indexOf('-') + 1))
.withZoneSameInstant(ZoneId.systemDefault())
.toLocalDate();
LocalDate weekAgo = LocalDate.now().minusDays(7);
return date.isBefore(weekAgo);
}
因此,我正在研究如何用javascript中的字符串进行日期比较,我发现大量堆栈溢出的帖子说你不能这样做。 参考: 如何在JavaScript中比较两个字符串日期? 用JavaScript比较两个日期 然而,下面的代码本与您所期望的完全一样,只使用字符串,当其中一个是YYYY-MM-DD而另一个是yyyy/mm/dd时,它甚至可以工作。有谁能解释一下为什么这样做,为什么stack overflow
问题内容: 我从API收到日期字符串,其格式为。 我目前正在使用正则表达式来验证字符串格式,这种方法可以正常工作,但是我可以看到某些情况,根据字符串,它可能是正确的格式,但实际上是无效的日期。即,例如。 PHP中是否有更好的方法来接收诸如这样的字符串,并确定该日期是否为该格式的有效日期? 问题答案: 您可以为此目的使用类: 测试用例:
我从API接收一个日期字符串,它的格式为。 我目前正在使用正则表达式来验证字符串格式,它工作正常,但是我可以看到一些情况,根据字符串,它可能是正确的格式,但实际上是无效的日期。 在PHP中有没有更好的方法来获取字符串,例如,并判断它是否是格式的有效日期?
我犯了一个错误,在数据库中将日期存储为VARCHAR,这里看起来是2018年12月2日,我使用carbon创建了一个变量来获取14天的当前日期。
问题内容: 作业:剪刀石头布游戏。 我创建了一个枚举: 从中我想比较各种价值观来决定谁是计算机还是人。设置值就可以了,并且比较也可以正常工作(纸张覆盖岩石,岩石压碎剪刀,剪刀切碎纸张)。但是,我不能束手无策。只要有平局,该用户即被宣布为获胜者。 唉唉......废话......这将澄清:是一个具有价值,或。我无法用比较来,正如你可以看到下面,是铸造类型从我的。 我猜这是一个不等于或无法匹配的问题,
问题内容: 所以我正在使用它根据每个字符的Unicode值与字符串进行字典顺序比较,并返回一个整数。这是一个代码示例。 在Java中比较日期是否错误? 在测试中,我没有遇到意外结果的情况。如果不是必须的话,我真的不想在字符串中创建Date对象,因为我是在一个长时间运行的循环中执行此操作的。 *根据下面的答案, *Ninja Edit Gleaning可以将日期与字符串进行比较,如果格式正确,则没有