遍历时间戳(日期和小时)

时间:2018-07-30 13:30:57

标签: scala loops timestamp

我有一些函数可以作为输入的特定开始时间戳和结束时间戳(例如“ 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)

非常感谢您的帮助!

4 个答案:

答案 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(_))