用飞镖添加/减去迄今的月/年?

cos*_*nus 5 dart flutter

我看到在dart中有一个Duration类,但是不能用它加/减年或月。您如何处理此问题,我需要从日期中减去6个月。是否有类似momentjs的飞镖之类的东西?谢谢

aab*_*iro 52

您可以使用subtractadd方法

 date1.subtract(Duration(days: 7, hours: 3, minutes: 43, seconds: 56)); 

 date1.add(Duration(days: 1, hours: 23)));
Run Code Online (Sandbox Code Playgroud)

颤振文档:

减去

添加

  • 这不应该是答案,因为它不能解决OP的问题,即持续时间不需要几个月或几年作为参数。但正如你所说,它可以正常工作几天、几小时、几分钟和/或几秒钟:) (21认同)

Jam*_*med 26

试试这个包,Jiffy。根据一个月和闰年有多少天来添加和减去日期时间。它遵循momentjs的简单语法

您可以使用以下单位进行加减

years, months, weeks, days, hours, minutes, seconds and milliseconds

增加 6 个月

DateTime d = Jiffy().add(months: 6).dateTime; // 2020-04-26 10:05:57.469367
// You can also add you own Datetime object
DateTime d = Jiffy(DateTime(2018, 1, 13)).add(months: 6).dateTime; // 2018-07-13 00:00:00.000
Run Code Online (Sandbox Code Playgroud)

您还可以使用 dart 方法级联进行链接

var jiffy = Jiffy().add(months: 5, years: 1);

DateTime d = jiffy.dateTime; // 2021-03-26 10:07:10.316874
// you can also format with ease
String s = jiffy.format("yyyy, MMM"); // 2021, Mar
// or default formats
String s = jiffy.yMMMMEEEEdjm; // Friday, March 26, 2021 10:08 AM
Run Code Online (Sandbox Code Playgroud)

  • 有趣的包。如果全部基于扩展方法就更好了 (2认同)

Ank*_*dik 13

以简单的方式,无需使用任何库,您可以添加月份年份

var date = new DateTime(2021, 1, 29);
Run Code Online (Sandbox Code Playgroud)

添加月份:-

 date = DateTime(date.year, date.month + 1, date.day);
Run Code Online (Sandbox Code Playgroud)

添加年份:-

 date = DateTime(date.year + 1, date.month, date.day);
Run Code Online (Sandbox Code Playgroud)


JCK*_*del 11

没那么简单。

final date = DateTime(2017, 1, 1);
final today = date.add(const Duration(days: 1451));
Run Code Online (Sandbox Code Playgroud)

这个结果是2020-12-21 23:00:00.000因为Dart考虑夏令时来计算日期(所以我的1451天少了1小时,这是非常危险的(例如:巴西在2019年废除了夏令时,但如果应用程序是在此之前编写的,结果将永远错了,如果将来重新引入夏令时,情况也会如此))。

要忽略日光计算,请执行以下操作:

final date = DateTime(2017, 1, 1);
final today = DateTime(date.year, date.month, date.day + 1451);
Run Code Online (Sandbox Code Playgroud)

是的。日期是 1451,这没问题。该today变量现在显示正确的日期和时间:2020-12-12 00:00:00.000


Smi*_*ily 10

好的,所以您可以分两步进行操作,取自@zoechi(Flutter的重要贡献者):

定义基准时间,让我们说:

var date = new DateTime(2018, 1, 13);
Run Code Online (Sandbox Code Playgroud)

现在,您想要新的日期:

var newDate = new DateTime(date.year, date.month - 1, date.day);
Run Code Online (Sandbox Code Playgroud)

你会得到

2017-12-13
Run Code Online (Sandbox Code Playgroud)

  • 它有效,但问题出在 momentjs/c# 中,如果您从 2000-08-31 减去 6 个月,您将得到 2000-02-29,而使用 dart 则得到 2000-03-02,这根本不是那么好。 (6认同)
  • 日期算术很困难,并且定义因实现而异。即使时间也是奇数......当您添加跨越 DST 边界的“1 天”时会发生什么?祝您好运,获得按照您想要的方式工作的东西。:) (3认同)
  • @polRk 所以 `new DateTime(date.year, date.month - 50, date.day)` 不起作用? (2认同)

小智 9

您可以使用subtractadd方法

减去

添加

但是您必须将结果重新分配给变量,这意味着:

这行不通

 date1.add(Duration(days: 1, hours: 23)));
Run Code Online (Sandbox Code Playgroud)

但这将:

 date1 = date1.add(Duration(days: 1, hours: 23)));
Run Code Online (Sandbox Code Playgroud)

例如:

 void main() {
  var d = DateTime.utc(2020, 05, 27, 0, 0, 0);
  d.add(Duration(days: 1, hours: 23));
  // the prev line has no effect on the value of d
  print(d); // prints: 2020-05-27 00:00:00.000Z

  //But
  d = d.add(Duration(days: 1, hours: 23));
  print(d); // prints: 2020-05-28 23:00:00.000Z
}
Run Code Online (Sandbox Code Playgroud)

飞镖链接


Tec*_*tya 9

这非常简单。

只需根据您的要求在日期时间参数上添加或减去数字即可。

例如 -

~ 在这里,我需要精确地获取 16 年前的日期时间,即使是毫秒,通过以下方式我得到了解决方案。

DateTime today = DateTime.now();
debugPrint("Today's date is: $today"); //Today's date is: 2022-03-17 09:08:33.891843
Run Code Online (Sandbox Code Playgroud)

进行所需的减法后;

  DateTime desiredDate = DateTime(
    today.year - 16,
    today.month,
    today.day,
    today.hour,
    today.minute,
    today.second,
    today.millisecond,
    today.microsecond,
  );
  debugPrint("16 years ago date is: $desiredDate"); // 16 years before date is: 2006-03-17 09:08:33.891843
Run Code Online (Sandbox Code Playgroud)