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
相关产品推荐
相关产品推荐

