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

Dart如何获取当月月初与月末的毫秒级Unix时间戳

问题说明
  • 运行环境:macOS arm64架构设备
  • Dart SDK版本:2.17.3稳定版(2022年6月1日发布)
  • 需求:获取当前月份开始、结束时刻对应的毫秒级Unix时间戳
  • 现有问题:编写的月末时间计算代码无法正确返回当月最后一天23:59:59.999对应的Unix时间戳,错误代码如下:
endOfMonthMilliseconds(DateTime now) {
    var beginningNextMonth = (now.month < 12) ? new DateTime(now.year, now.month + 1, 1) : new DateTime(now.year + 1, 1, 1);
    var lastDay = beginningNextMonth.subtract(new Duration(days: 1)).millisecondsSinceEpoch;
  }
错误原因

代码中构造的beginningNextMonth默认是下月1日的00:00:00.000,直接减去1天时长,得到的是当月最后一天的00:00:00.000,和目标时间差了近24小时,结果必然错误。

额外注意:Dart中默认DateTime构造函数生成本地时区时间,如果业务需要UTC标准时间,要使用DateTime.utc()构造时间对象,避免时区偏移导致时间戳计算错误。

正确实现

本地时区版本

// 获取当月起始毫秒时间戳(当月1日 00:00:00.000)
int startOfMonthMilliseconds(DateTime now) {
  return DateTime(now.year, now.month, 1).millisecondsSinceEpoch;
}

// 获取当月结束毫秒时间戳(当月最后一日 23:59:59.999)
int endOfMonthMilliseconds(DateTime now) {
  final beginningNextMonth = now.month < 12
      ? DateTime(now.year, now.month + 1, 1)
      : DateTime(now.year + 1, 1, 1);
  // 下月1日0点向前推1毫秒,即为当月最后一刻
  return beginningNextMonth.subtract(const Duration(milliseconds: 1)).millisecondsSinceEpoch;
}

该写法不需要单独判断当月天数(28/29/30/31天),也不受夏令时切换影响,所有月份通用。Dart 2.x版本中new关键字为可选语法,实际开发中可省略。

UTC时区版本

适合跨时区业务、服务端场景使用,避免本地时区偏差:

int startOfMonthMillisecondsUtc(DateTime now) {
  return DateTime.utc(now.year, now.month, 1).millisecondsSinceEpoch;
}

int endOfMonthMillisecondsUtc(DateTime now) {
  final beginningNextMonth = now.month < 12
      ? DateTime.utc(now.year, now.month + 1, 1)
      : DateTime.utc(now.year + 1, 1, 1);
  return beginningNextMonth.subtract(const Duration(milliseconds: 1)).millisecondsSinceEpoch;
}

内容的提问来源于stack exchange,提问作者Dolphin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 03:33:06