在 Flutter / Dart 中获取上个月的日期

问题描述 投票:0回答:10

在 flutter 中我们可以使用这个来获取当前月份

var now = new DateTime.now();
var formatter = new DateFormat('MM');
String month = formatter.format(now);

但是如何获取上个月的日期呢?特别是如果当前日期是一月 (01)。当我们使用操作数减号 (-) 时,我们无法获得正确的月份,例如月份 - 1。

datetime dart flutter
10个回答
46
投票

你可以直接使用

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

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

你得到

2017-12-13

在进行日期计算之前,最好先转换为 UTC,然后再转换回本地日期/时间,以避免夏令时和时区问题。


15
投票

我们可以计算该月的第一天和该月的最后一天:

DateTime firstDayCurrentMonth = DateTime.utc(DateTime.now().year, DateTime.now().month, 1);

DateTime lastDayCurrentMonth = DateTime.utc(DateTime.now().year, DateTime.now().month + 1).subtract(Duration(days: 1));

DateTime.utc
接受整数值作为参数:int 年、int 月、int 日等。


10
投票

尝试这个包,Jiffy,它使用了momentjs语法。见下文

Jiffy().subtract(months: 1);

其中

Jiffy()
现在返回日期。你也可以这样做,同样的结果

var now = DateTime.now();
Jiffy(now).subtract(months: 1);

6
投票

我们可以使用减法来获取过去一个月的日期。

DateTime pastMonth = DateTime.now().subtract(Duration(days: 30));

2
投票

日期很难计算。这里有一个公开提案,支持添加年份和月份https://github.com/dart-lang/sdk/issues/27245

在“a”中添加月份和年份存在语义问题 “月”和“年”不是具体的时间长度。年数有所不同 天、月最多三天。 30号加上“一个月” 一月是模棱两可的。我们可以做到,我们只需要选择一些 2 月 27 日至 3 月 2 日之间的任意一天。 这就是为什么我们没有在持续时间中添加月份和年份 - 他们没有 描述持续时间。

您可以使用下面的代码以任意方式添加月份(我认为它不完全准确。摘自问题)

const _daysInMonth = const [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

bool isLeapYear(int value) =>
    value % 400 == 0 || (value % 4 == 0 && value % 100 != 0);

int daysInMonth(int year, int month) {
  var result = _daysInMonth[month];
  if (month == 2 && isLeapYear(year)) result++;
  return result;
}

DateTime addMonths(DateTime dt, int value) {
  var r = value % 12;
  var q = (value - r) ~/ 12;
  var newYear = dt.year + q;
  var newMonth = dt.month + r;
  if (newMonth > 12) {
    newYear++;
    newMonth -= 12;
  }
  var newDay = min(dt.day, daysInMonth(newYear, newMonth));
  if (dt.isUtc) {
    return new DateTime.utc(
        newYear,
        newMonth,
        newDay,
        dt.hour,
        dt.minute,
        dt.second,
        dt.millisecond,
        dt.microsecond);
  } else {
    return new DateTime(
        newYear,
        newMonth,
        newDay,
        dt.hour,
        dt.minute,
        dt.second,
        dt.millisecond,
        dt.microsecond);
  }
}

0
投票

要在月初获得设定的起点,您可以将

DateTime
Jiffy 包一起使用。

DateTime firstOfPreviousMonth 
  = DateTime.parse(
      Jiffy().startOf(Units.MONTH)
           .subtract(months: 1)
           .format('yyyy-MM-dd'). //--> Jan 1 '2021-01-01 00:00:00.000'
  );  

var fifthOfMonth 
  = firstOfPreviousMonth.add(Duration(days: 4)); //--> Jan 5 '2021-01-05 00:00:00.000'

DateTime endOfPreviousMonth 
  = DateTime.parse(
      Jiffy().endOf(Units.MONTH)
           .subtract(months: 2)
           .format('yyyy-MM-dd'). //--> Dec 30 '2020-12-31 00:00:00.000' 
                                  // endOf always goes to 30th
  );  

var previousMonth 
      = endOfPreviousMonth.add(Duration(days: 2)); //--> Jan 1 '2021-01-01 00:00:00.000'

0
投票

日期格式('MMMM yyyy') .format(DateTime(DateTime.now().year, DateTime.now().month - 2)),


0
投票
 List<DateTime> newList = [];
 DateFormat format = DateFormat("yyyy-MM-dd");
    for (var i = 0; i < recents.length; i++) {
  newList.add(format.parse(recents[i]['date'].toString()));
}
newList.sort(((a, b) => a.compareTo(b)));
var total = 0;
for (var i = 0; i < newList.length; i++) {
if (DateTime.now().difference(newList[i]).inDays < 30) {
print(newList[i]);
total++;
}
}
print(total);

您可以使用它来获取最近 30 天的数据。


0
投票

var prevMonth = new DateTime(日期.年,日期.月 - 1,日期.日);

获取上个月的日期。如果当前月份是一月,这将不起作用。

正确的是

var prevMonth = new DateTime(date.month == 1?date.year-1:date.year, date.month - 1, date.day);


-3
投票

除了Günter Zöchbauer答案

var now = new DateTime.now();
    String g = ('${now.year}/ ${now.month}/ ${now.day}');
    print(g);
© www.soinside.com 2019 - 2024. All rights reserved.