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

fjaof16o  于 2022-12-27  发布在  Flutter
关注(0)|答案(9)|浏览(370)

在Flutter中,我们可以用这个来得到当前月份

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

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

alen0pnh

alen0pnh1#

你可以用

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

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

你得到

2017-12-13

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

ohtdti5x

ohtdti5x2#

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

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接受整数值作为参数:整数年、整数月、整数日等等。

tpxzln5u

tpxzln5u3#

试试这个包Jiffy,它使用momentjs语法。

Jiffy().subtract(months: 1);

其中Jiffy()返回date now。您也可以执行以下操作,得到相同的结果

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

uinbv5nw4#

我们可以使用减法来得到过去的月份日期。

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

m3eecexj5#

日期是很难计算的。有一个公开的提议,在这里添加对添加年和月的支持https://github.com/dart-lang/sdk/issues/27245
添加月份和年份有一个语义问题,因为“a month”和“a year”不是一个特定的时间量。年份相差一天,月份相差三天。将“a month”添加到1月30日是不明确的。我们可以这样做,我们只需要在2月27日和3月2日之间任意选择一天,这就是为什么我们没有在Duration中添加月份和年份-它们没有描述持续时间。
你可以用下面的代码任意添加月份(我猜它并不完全准确,摘自本期)

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);
  }
}
5sxhfpxr

5sxhfpxr6#

要在月初获得一个设定的起点,可以将DateTimeJiffy包沿着使用。

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'
643ylb08

643ylb087#

日期格式(“年-月-日”).格式(日期时间(DateTime.now().年,日期时间.现在().月-2)),

mbjcgjjk

mbjcgjjk8#

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天的信息。

pinkon5k

pinkon5k9#

除了君特·策施鲍尔

var now = new DateTime.now();
    String g = ('${now.year}/ ${now.month}/ ${now.day}');
    print(g);

相关问题