打印连续的日期使用连字符

huangapple go评论81阅读模式
英文:

Print consecutive dates using hyphen

问题

Sure, here's the translated content:

我有一串以ddMMMyyyy形式存储的日期列表,这些日期可能连续也可能不连续。我会将这些日期逐个打印出来。如果日期是连续的,我想要将它们用连字符连接起来。

例如

13Aug2020
15Aug2020 - 18Aug2020
22Aug2020

而不是

13Aug2020
15Aug2020
16Aug2020
17Aug2020
18Aug2020
22Aug2020

用于打印日期的代码:

mDateView.setText(mDateValue.replace(",", "\n"));

其中,mDateView是一个TextView,mDateValue是包含所有日期的字符串,日期之间用逗号分隔。

英文:

I have a list of dates in the form of ddMMMyyyy stored in one single string. The dates may or may not be consecutive
I print those dates as individual dates. I want to remove that and use hyphen if the dates are consecutive.

For Example

13Aug2020
15Aug2020 - 18Aug2020
22Aug2020

Instead of

13Aug2020
15Aug2020
16Aug2020
17Aug2020
18Aug2020
22Aug2020

Code used to Print Dates :

mDateView.setText(mDateValue.replace(",", "\n"));

where mDateView is a Textview and mDateValue is the String containing all the dates seperated by Commas

答案1

得分: 2

使用 DateTimeFormatter 将每个字符串解析为 LocalDate 对象。搜索如何做到这一点(如果搜索结果指向使用旧的且麻烦的 SimpleDateFormat 的页面,则避免那种情况)。为当前间隔创建两个变量,分别表示起始日期和结束日期。将第一个日期存储在两个变量中。在循环中遍历剩余的日期:

  • 如果当前日期是结束日期的后一天,则将其存储在结束日期中,从而将间隔延长一天。
  • 否则打印当前间隔,关于如何打印,请参见下文。然后再次将当前日期存储在起始和结束日期中。

循环终止后,打印当前间隔。

如何打印当前间隔:如果起始日期和结束日期相等,则只打印其中一个;否则在它们之间用一个中划线打印。在任何情况下,都使用所需格式对每个打印的日期进行格式化,例如使用相同的 DateTimeFormatter 进行格式化。

要确定当前日期是否是结束日期的后一天,使用 LocalDateplusDaysisEqual 方法。

问题:LocalDate 不是需要 Android API 级别 26 吗?

LocalDatejava.time 中的一部分,这是现代的 Java 日期和时间 API。java.time 在较旧和较新的 Android 设备上都可以很好地工作。它只需要至少 Java 6

  • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 开始),现代 API 已内置。
  • 在非 Android 的 Java 6 和 7 中,可以使用 ThreeTen Backport,这是现代类的后移版本(ThreeTen for JSR 310;请参见底部的链接)。
  • 在较旧的 Android 设备上,可以使用 desugaring 或者 Android 版的 ThreeTen Backport(称为 ThreeTenABP)。在后一种情况下,请确保从 org.threeten.bp 及其子包中导入日期和时间类。

链接

英文:

Parse each string into a LocalDate object using a DateTimeFormatter. Search for how (if your search leads to a page using the old and troublesome SimpleDateFormat, avoid that). Create two variables for the start and end of the current interval. Store the first date into both. In a loop over the remaining dates:

  • If the current date is one day after the end, store it into the end, thus extending the interval by one day.
  • Otherwise print the current interval, see below for how. Then again store the current date into both start and end.

After the loop terminates, print the current interval.

How to print the current interval: if start and end are equal, print only one of them; otherwise print both with an en-dash between them. In either case format each printed date into the desired format, for example the original format using the same DateTimeFormatter.

To determine whether current date is one day after end, use the plusDays and the isEqual methods of LocalDate.

Question: Doesn’t LocalDate require Android API level 26?

LocalDate is part of java.time, the modern Java date and time API. java.time works nicely on both older and newer Android devices. It just requires at least Java 6.

  • In Java 8 and later and on newer Android devices (from API level 26) the modern API comes built-in.
  • In non-Android Java 6 and 7 get the ThreeTen Backport, the backport of the modern classes (ThreeTen for JSR 310; see the links at the bottom).
  • On older Android either use desugaring or the Android edition of ThreeTen Backport. It’s called ThreeTenABP. In the latter case make sure you import the date and time classes from org.threeten.bp with subpackages.

huangapple
  • 本文由 发表于 2020年7月26日 06:32:23
  • 转载请务必保留本文链接:https://go.coder-hub.com/63094220.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定