Flutter中如何编程获取当年及指定月份的起始日期
Flutter/Dart 实现日期获取方案
Flutter 环境下不需要引入任何第三方日期处理库,直接用内置的DateTime类就能实现需求,所有闰年、月份天数差、时区兼容逻辑官方已经内置处理,不需要手动计算。
1. 获取当前年份的起始日期
当年起始日期就是当前年份的1月1日0点,直接取当前时间的年份,传入DateTime构造器即可:
DateTime getFirstDayOfCurrentYear({bool isUtc = false}) { final now = DateTime.now(); return isUtc ? DateTime.utc(now.year, 1, 1) : DateTime(now.year, 1, 1); }
如果需要UTC时间传isUtc: true即可,默认返回本地时区时间。
2. 获取指定月份的起始日期
任意月份的起始日期就是对应年份对应月份的1号0点,封装通用方法如下:
/// 获取目标月份的第一天起始时间 /// [year] 目标年份,[month] 目标月份,取值范围1-12 /// [isUtc] 是否返回UTC时间,默认返回本地时区时间 DateTime getFirstDayOfMonth(int year, int month, {bool isUtc = false}) { // 月份参数合法性校验,避免非法传参 assert(month >= 1 && month <= 12, '月份取值必须在1到12区间内'); return isUtc ? DateTime.utc(year, month, 1) : DateTime(year, month, 1); }
如果要获取当前年份下指定月份的起始日期,直接传入当前年份即可,示例:
// 获取今年10月的第一天 final now = DateTime.now(); final firstDayOfOct = getFirstDayOfMonth(now.year, 10);
注意事项
- 不要通过「上月最后一天+1天」的偏移逻辑计算月首,跨夏令时、跨时区场景下容易出现时间偏移bug,直接通过DateTime构造器传入年、月、日=1的写法是最稳定、性能最高的方案。
- DateTime构造器默认对传入的超范围参数做自动进位,比如传入month=13会自动算成下一年1月,所以加参数校验能避免业务逻辑传参错误。
- 如果需要特定时分秒的月首/年首时间,直接在构造器里追加hour、minute、second、millisecond参数即可,不传的话默认所有时间字段都是0,刚好对应当日0点的起始时间。
内容的提问来源于stack exchange,提问作者gopinath
相关产品推荐
相关产品推荐

