You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 18:01:00