同一天或一个月中的Java日期

问题描述 投票:0回答:3

我需要编写一种方法,将日期作为输入参数,格式为YYYY-MM-DD,并从列表中返回同一天的所有日期。

列表中的日期看起来像像这样:2020-06-09T07:10:28.1985307Z

我是否需要使用“-”解析参数,然后对字符串的MM部分进行分析,然后与列表日期的MM部分进行比较?似乎太复杂了,您能给我一些更好解决问题的建议吗?

java date string-comparison
3个回答
3
投票

您说'格式为YYYY-MM-DD',这表明您实际得到的是字符串对象,而不是日期对象。日期,LocalDate,Instant等,这些都不是[[have格式。它们代表他们以其名字命名的事物(日期(日期错误除外),但实际上代表了基于时差的无时区瞬间,并且与人类的日期概念完全没有关系)。

要使用日期,您希望..具有日期对象。或者更确切地说,是java.time包中的正确类型。如果只是约会,您正在寻找LocalDate。这些是无时区的。它们只是代表“ 1985年4月4日”的概念,没有涉及位置。您输入的不是日期。考虑到这是一个微小的指定时间(第二个分数不少于6位数字),它们实际上是时间上的时刻,并且包括一个时区,该时区甚至是人类甚至不用于正常目的的时区。这表明您真正要寻找的是Instant

然后您想立即做一些奇怪的事情:检查

DATE

。您将时间的概念与日期的概念混合在一起,而日期的概念基本上不是时间。毕竟,如果它是荷兰4月4日,那么很可能是纽约4月3日。如果说1917年10月25日在莫斯科,那是11月7日在阿姆斯特丹。在没有先本地化的情况下,试图将“日期”等同起来是没有意义的。你问谁他们住在哪里?您可以通过多种方式将java.time程序包中的各种类型从即时更改为日期,然后再转换为日期。这是一种方法:

public static Instant read(String in) { return Instant.parse(in); } public static LocalDate localize(Instant i, ZoneId zone) { return i.atZone(zone).toLocalDate(); } public static void main(String[] args) throws Exception { Instant a = Instant.parse("2020-06-09T07:10:28.1985307Z"); Instant b = Instant.parse("2020-04-09T07:10:28.1985307Z"); Instant c = Instant.parse("2020-06-09T23:10:28.1985307Z"); ZoneId ams = ZoneId.of("Europe/Amsterdam"); LocalDate aDate = localize(a, ams); LocalDate bDate = localize(b, ams); LocalDate cDate = localize(c, ams); System.out.println(aDate.isEqual(cDate)); }

以上将最终打印'false'。 2020-06-09T07:10:28.1985307Z所描述的即时时间将被阿姆斯特丹的某人描述为2020年6月9日。即时2020-06-09T23:10:28.1985307Z将被描述为第十(当时阿姆斯特丹将+0200)。将区域切换到纽约,答案将是正确的。

问题'这两个时刻是同一天'不是要问的明智问题,在该问题中也不包括哪个区域在问。请注意,UTC本身就是一个区域,您可以使用它:ZoneId utc = ZoneOffset.UTC;将带您到达那里。


1
投票
日期类已过时。对您的解决方案使用LocalDate和ZonedDateTime。

public class Test { public static void main(String[] args){ Test t = new Test(); List<LocalDate> result = t.fetchDates(LocalDate.parse("2020-06-09")); System.out.println(result); } private List<ZonedDateTime> datesList = List.of( ZonedDateTime.parse("2020-06-09T07:10:28.1985307Z"), ZonedDateTime.parse("2020-06-01T01:10:28.1985307Z"), ZonedDateTime.parse("2020-06-09T01:10:28.1985307Z"), ZonedDateTime.parse("2020-06-08T01:10:28.1985307Z"), ZonedDateTime.parse("2020-06-09T01:10:28.1985307Z") ); public List<LocalDate> fetchDates(LocalDate date) { return datesList.stream() .filter(zdt -> zdt.toLocalDate().equals(date)) .map(zdt -> zdt.toLocalDate()) .collect(Collectors.toList()); } }

打印[2020-06-09、2020-06-09、2020-06-09]    

0
投票
1-将输入字符串转换为LocalDate

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate date = LocalDate.parse(str, formatter);

2-掌握了LocalDate之后,您可以执行许多操作,例如检索当前日,月,年等。解析所有日期并实现您的逻辑,这些是一些相关方法:

date.getDayOfYear(); date.minusMonths(); date.isBefore();

© www.soinside.com 2019 - 2024. All rights reserved.