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

时间:2019-02-20 17:22:40

标签: dart flutter

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

10 个答案:

答案 0 :(得分:29)

您可以使用subtractadd方法

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

 date1.add(Duration(days: 1, hours: 23)));

Flutter Docs:

Subtract

Add

答案 1 :(得分:5)

您可以使用subtractadd方法

Subtract

Add

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

这行不通

 date1.add(Duration(days: 1, hours: 23)));

但这会:

 date1 = date1.add(Duration(days: 1, hours: 23)));

例如:

 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
}

Dartpad link

答案 2 :(得分:3)

没那么简单。

final date = DateTime(2017, 1, 1);
final today = date.add(const Duration(days: 1451));

这导致 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);

是的。天是 1451,这是可以的。 today 变量现在显示正确的日期和时间:2020-12-12 00:00:00.000

答案 3 :(得分:3)

在不使用任何库的情况下,您可以通过简单的方式添加

var date = new DateTime(2021, 1, 29);

添加月份:-

float

添加年份:-

 date = DateTime(date.year, date.month + 1, date.day);

答案 4 :(得分:2)

尝试使用此软件包Jiffy。相对于一个月中有多少天以及also年加减日期时间。它遵循momentjs

的简单语法

您可以使用以下单位加减

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

要添加6个月

DateTime d = Jiffy().add(months: 6); // 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); // 2018-07-13 00:00:00.000

您还可以使用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

答案 5 :(得分:2)

addsubtract方法与Duration对象一起使用,以基于另一个对象创建新的DateTime对象。

var date1 = DateTime.parse("1995-07-20 20:18:04");

var newDate = date1.add(Duration(days: 366));

print(newDate); // => 1996-07-20 20:18:04.000

请注意,添加的持续时间实际上是50 * 24 * 60 * 60秒。如果所得的DateTime的夏令时偏移与此不同,则结果将没有与此相同的一天中的时间,甚至可能不会在50天后达到日历日期。

在使用本地时间的日期时要小心。

答案 6 :(得分:1)

好的,因此您可以分两步来完成此操作,取自@zoechi(Flutter的重要贡献者):

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

var date = new DateTime(2018, 1, 13);

现在,您想要新的日期:

var newDate = new DateTime(date.year, date.month - 1, date.day);

你会得到

2017-12-13

答案 7 :(得分:0)

可以减去任何月份。

  DateTime subtractMonths(int count) {
    var y = count ~/ 12;
    var m = count - y * 12;

    if (m > month) {
      y += 1;
      m = month - m;
    }

    return DateTime(year - y, month - m, day);
  }

也可以

DateTime(date.year, date.month + (-120), date.day);

答案 8 :(得分:0)

Future<void> main() async {
  final DateTime now = DateTime.now();
  var kdate = KDate.buildWith(now);
  log("YEAR", kdate.year);
  log("MONTH", kdate.month);
  log("DATE", kdate.date);
  log("Last Year", kdate.lastYear);
  log("Last Month", kdate.lastMonth);
  log("Yesturday", kdate.yesturday);
  log("Last Week Date", kdate.lastWeekDate);
}

void log(title, data) {
  print("\n$title  ====>  $data");
}

class KDate {
  KDate({
    this.now,
    required this.year,
    required this.month,
    required this.date,
    required this.lastYear,
    required this.lastMonth,
    required this.yesturday,
    required this.lastWeekDate,
  });
  final DateTime? now;
  final String? year;
  final String? month;
  final String? date;
  final String? lastMonth;
  final String? lastYear;
  final String? yesturday;
  final String? lastWeekDate;

  factory KDate.buildWith(DateTime now) => KDate(
        now: now,
        year: (now.year).toString().split(" ")[0],
        month: (now.month).toString().split(" ")[0],
        date: (now.day).toString().split(" ")[0],
        lastYear: (now.year - 1).toString().split(" ")[0],
        lastMonth: DateTime(now.year, now.month, now.month)
            .subtract(Duration(days: 28))
            .toString()
            .split(" ")[0]
            .toString()
            .split("-")[1],
        yesturday: DateTime(now.year, now.month, now.day)
            .subtract(Duration(days: 1))
            .toString()
            .split(" ")[0]
            .toString()
            .split("-")
            .last,
        lastWeekDate: DateTime(now.year, now.month, now.day)
            .subtract(Duration(days: 7))
            .toString()
            .split(" ")[0]
            .toString()
            .split("-")
            .last,
      );
}

答案 9 :(得分:0)

日/月/年的增减可以通过DateTime类来完成

初始化需要显示的DateFormat

  var _inputFormat = DateFormat('EE, d MMM yyyy');
  var _selectedDate = DateTime.now();

增加日/月/年:

_selectedDate = DateTime(_selectedDate.year, _selectedDate.month + 1, _selectedDate.day);

增加日/月/年:

  _selectedDate = DateTime(_selectedDate.year,
                            _selectedDate.month - 1, _selectedDate.day);

上面的例子只是月份,类似的方式我们可以增加或减少年和日。