我有一些函数可以作为输入的特定开始时间戳和结束时间戳(例如“ 2018-01-01 16:00:00” 和“ 2018-01- 01 17:00:00“ )(在代码i import java.sql.Timestamp
的开头)
我想在一段时间内迭代此功能(例如-在2018年1月1日至2018年10月10日之间,分别每小时进行一次迭代)。
我到目前为止最远的是使用import java.time.{LocalDate, Period}
对日期进行迭代
但是当我尝试将代码更改为import java.time.{LocalDateTime, Period}
时,它不起作用:
import java.time.temporal.ChronoUnit
import java.time.temporal.ChronoField.HOUR_OF_DAY
import java.time.{LocalDateTime, Period}
val start = LocalDateTime.of(2018, 1, 1,6,20)
val end = LocalDateTime.of(2018, 1, 11,6,30)
val dates: IndexedSeq[LocalDateTime] =
(0L to (end.toEpochSecond() - start.toEpochSecond())).map(hours =>
start.plusHours(hours)
)
dates.foreach(println)
非常感谢您的帮助!
答案 0 :(得分:1)
您可以利用scala流和localdatetime API来使事情比您尝试过的要容易得多,也就是说,级别太低了^^!
val allDatesBeforeEnd = Stream.iterate(start)(_.plusHours(1)).takeWhile(_.isBefore(end)).toList
答案 1 :(得分:0)
import java.time.{LocalDateTime, Period}
val start = LocalDateTime.of(2018, 1, 1,6,20)
val end = LocalDateTime.of(2018, 1, 11,6,30)
val periodInHours = Period.between(start.toLocalDate(), end.toLocalDate()).getDays*24
val dates: IndexedSeq[LocalDateTime] = (0L to periodInHours).map(start.plusHours(_))
dates.foreach(println)
答案 2 :(得分:0)
您可以首先获取两个日期时间之间的小时数,然后在该小时数形成的范围内循环以创建日期时间范围:
val allDatesBeforeEnd =
(0L until ChronoUnit.HOURS.between(start, end)).map(start.plusHours(_))
尽管我更喜欢阅读C4stor's solution,但由于它不对每次迭代执行takeWhile
isBefore
检查,因此该解决方案在性能方面可能会稍好一些。
答案 3 :(得分:-1)
尝试一下,它会打印昨天到今天之间的所有时间,只需根据您的使用情况进行调整即可:
val yesterday = LocalDateTime.now().minusDays(1)
val today = LocalDateTime.now()
Stream.iterate(yesterday){
h => h.plusHours(1)
}.takeWhile(_.isBefore(today)).foreach(println(_))