如何获取两个Epoch毫秒数之间的所有每周间隔Epoch毫秒数?
解决方案
首先不建议继续使用Calendar这类旧日期API,推荐用Java 8引入的java.time包(Scala完全兼容),它的API更清晰,也避免了旧API的线程安全问题和周计算歧义。
实现步骤
- 将起始和结束的Epoch毫秒数转换为
Instant(对应UTC时间),如果需要按本地时区处理周间隔,也可以转成ZonedDateTime。 - 循环每周递增,收集所有不超过结束时间的时间戳。
代码示例
import java.time.{Instant, ZoneId} import java.time.temporal.ChronoUnit // 定义输入的起始和结束毫秒数 val fromEpochMillis = 1668940033492L val toEpochMillis = 1676716033492L // 示例结束时间,比起始时间晚约10周 // 转换为Instant val startInstant = Instant.ofEpochMilli(fromEpochMillis) val endInstant = Instant.ofEpochMilli(toEpochMillis) // 生成每周间隔的时间戳列表 val weeklyTimestamps = Iterator.iterate(startInstant)(_.plus(1, ChronoUnit.WEEKS)) .takeWhile(_.isBefore(endInstant) || _.equals(endInstant)) .map(_.toEpochMilli) .toList // 输出结果 weeklyTimestamps.foreach(println)
如果坚持使用旧API(不推荐)
如果一定要用Calendar,可以用循环来持续递增直到超过结束时间:
import java.util.{Calendar, Date} import scala.util.control.Breaks._ val fromEpochMillis = 1668940033492L val toEpochMillis = 1676716033492L val calendar = Calendar.getInstance() calendar.setTime(new Date(fromEpochMillis)) val weeklyTimestamps = collection.mutable.ListBuffer[Long]() weeklyTimestamps.append(fromEpochMillis) breakable { while (true) { calendar.add(Calendar.WEEK_OF_YEAR, 1) val currentMillis = calendar.getTime.getTime if (currentMillis > toEpochMillis) break weeklyTimestamps.append(currentMillis) } } val result = weeklyTimestamps.toList
注意事项
- 使用
ChronoUnit.WEEKS递增时,是严格按7天计算;如果需要按自然周(比如周一到周日),可以先将Instant转成ZonedDateTime,调整到周的第一天再开始递增。 - 旧API的
Calendar.WEEK_OF_YEAR会受时区和所在地区的周起始日影响,不同地区可能把周日或周一作为一周的第一天,容易出现不一致。
内容的提问来源于stack exchange,提问作者Alim Uddin
相关产品推荐
相关产品推荐

