以周、月和年为单位的 dart 日期时差

m528fe3b  于 2023-03-21  发布在  其他
关注(0)|答案(4)|浏览(146)

我正在做一个项目,想把日期时间的差异按分钟、小时、天、周、月和年来计算,我可以把分钟增加到天。

DateTime.now().difference(DateTime(2019, 10, 7)).inDays

但是我花了几个星期,几个月和几年的时间才创造出来,我怎么能这样做呢,请帮助

hzbexzde

hzbexzde1#

我构建了一个名为Jiffy的包来帮助我

Jiffy([2018, 1, 29]).diff(Jiffy([2019, 10, 7]), Units.DAY); // -616
Jiffy([2018, 1, 29]).diff(Jiffy([2019, 10, 7]), Units.WEEK); // -88
Jiffy([2018, 1, 29]).diff(Jiffy([2019, 10, 7]), Units.MONTH; // -20
Jiffy([2018, 1, 29]).diff(Jiffy([2019, 10, 7]), Units.YEAR); // -1
wpx232ag

wpx232ag2#

有一种非常简单易行的方法可以做到这一点,并且只需要很少的日期/时间算术知识。
只需比较两个DateTimes的微秒自历元值:

Duration compare(DateTime x, DateTime y) {
   return Duration(microseconds: (x.microsecondsSinceEpoch - y.microsecondsSinceEpoch).abs())
}

DateTime x = DateTime.now()
DateTime y = DateTime(1994, 11, 1, 6, 55, 34);

Duration diff = compare(x,y);

print(diff.inDays);
print(diff.inHours);
print(diff.inMinutes);
print(diff.inSeconds);

上面的代码可以工作,而且比检查闰年和基于时间的异常更有效。
为了得到更大的单位,我们可以进行近似计算,大多数最终用户对这种一般近似值都很满意:
周:天数除以7,四舍五入。
月:天数除以30.44四舍五入;如果〈1,则显示月份。
年:将天数除以365.25和下限,并显示以12为模的月份。

nue99wik

nue99wik3#

你可以手动计算月份差异大小(不使用任何packege):

static int getMonthSizeBetweenDates(DateTime initialDate, DateTime endDate){
    return calculateMonthSize(endDate)-calculateMonthSize(initialDate)+1;
  }

  static int calculateMonthSize(DateTime dateTime){
    return dateTime.year*12+dateTime.month;
  }

getMonthSizeBetweenDates方法提供初始日期和结束日期之间的月份数。例如:你的初始日期是1.1.2022,你的结束日期是1.3.2022。那么这个方法返回3(January,Fabruary和March)
你可以用这个逻辑找到周和年的差异。
另一种方法:

static int getMonthSizeBetweenDates2(DateTime initialDate, DateTime endDate){
    return (endDate.year-initialDate.year)*12+(endDate.month-initialDate.month)+1;
  }
e4yzc0pl

e4yzc0pl4#

为了增强AKushWarrior提供的答案,你可以创建一个这样的帮助函数,并在任何需要的地方使用它。它是一个静态函数,所以你甚至不需要示例。

static String calculateTime(DateTime time) {
    Duration compare(DateTime x, DateTime y) {
      return Duration(microseconds: (x.microsecondsSinceEpoch - y.microsecondsSinceEpoch).abs());
    }

DateTime x = DateTime.now();
DateTime y = time;

Duration diff = compare(x,y);
int days = diff.inDays;
int hours = diff.inHours;
int minutes = diff.inMinutes;

String result = '';
if(days > 365){ result =  '${(days/365).floor().toString()} Year(s)'; }
else if(days > 30){ result =  '${(days/30).floor().toString()} Month(s)'; }
else if(days > 7){ result =  '${(days/7).floor().toString()} Week(s)'; }
else if(days > 1){ result =  '${(days/1).floor().toString()} Day(s)'; }
else if(hours > 1){ result =  '$hours Hour(s)'; }
else if(minutes > 1){ result =  '$minutes Minute(s)'; }
else{ result =  'Now'; }

return result;

}

相关问题