Add/Subtract months/years 到目前为止在 dart 中?
Add/Subtract months/years to date in dart?
我看到在 dart 中有一个 class 持续时间,但不能使用 add/subtract 年或月。你是如何解决这个问题的,我需要从日期中减去 6 个月。飞镖或周围是否有类似 moment.js 的东西?
谢谢
好的,您可以分两步完成,摘自 (Flutter 的重要贡献者):
定义基准时间,假设:
var date = new DateTime(2018, 1, 13);
现在,您想要新的日期:
var newDate = new DateTime(date.year, date.month - 1, date.day);
你会得到
2017-12-13
试试这个包,Jiffy. Adds and subtracts date time with respect to how many days there are in a month and also leap years. It follows the simple syntax of 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
您也可以使用 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
您可以使用 subtract
和 add
方法
date1.subtract(Duration(days: 7, hours: 3, minutes: 43, seconds: 56));
date1.add(Duration(days: 1, hours: 23)));
Flutter 文档:
您可以使用 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
}
可以减去任意月数。
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);
对 Duration
对象使用 add
和 subtract
方法以基于另一个对象创建新的 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 具有与此不同的夏令时偏移量,则结果将与此不同 time-of-day,甚至可能不会在 50 天后到达日历日期。
处理当地时间日期时要小心。
没那么简单。
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
.
在不使用任何库的情况下,您可以添加 Month 和 Year
var date = new DateTime(2021, 1, 29);
加月:-
date = DateTime(date.year, date.month + 1, date.day);
添加年份:-
date = DateTime(date.year + 1, date.month, date.day);
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,
);
}
增加和减少 day/month/year 可以通过 DateTime class
初始化需要显示的日期格式
var _inputFormat = DateFormat('EE, d MMM yyyy');
var _selectedDate = DateTime.now();
增加Day/month/year:
_selectedDate = DateTime(_selectedDate.year,
_selectedDate.month + 1, _selectedDate.day);
增加Day/month/year:
_selectedDate = DateTime(_selectedDate.year,
_selectedDate.month - 1, _selectedDate.day);
以上示例仅针对月份,类似的方式我们可以增减年和日。
非常简单。
DateTime参数根据自己的需要简单的加减即可。
例如-
~ 在这里,我需要从今天开始准确地获得 16 年前的 date-time,即使是几毫秒,并且通过以下方式我得到了我的解决方案。
DateTime today = DateTime.now();
debugPrint("Today's date is: $today"); //Today's date is: 2022-03-17 09:08:33.891843
所需减法后;
DateTime desiredDate = DateTime(
today.year - 16,
today.month,
today.day,
today.hour,
today.minute,
today.second,
today.millisecond,
today.microsecond,
);
debugPrint("18 years before date is: $desiredDate"); // 18 years before date is: 2006-03-17 09:08:33.891843
我看到在 dart 中有一个 class 持续时间,但不能使用 add/subtract 年或月。你是如何解决这个问题的,我需要从日期中减去 6 个月。飞镖或周围是否有类似 moment.js 的东西? 谢谢
好的,您可以分两步完成,摘自
定义基准时间,假设:
var date = new DateTime(2018, 1, 13);
现在,您想要新的日期:
var newDate = new DateTime(date.year, date.month - 1, date.day);
你会得到
2017-12-13
试试这个包,Jiffy. Adds and subtracts date time with respect to how many days there are in a month and also leap years. It follows the simple syntax of 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
您也可以使用 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
您可以使用 subtract
和 add
方法
date1.subtract(Duration(days: 7, hours: 3, minutes: 43, seconds: 56));
date1.add(Duration(days: 1, hours: 23)));
Flutter 文档:
您可以使用 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
}
可以减去任意月数。
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);
对 Duration
对象使用 add
和 subtract
方法以基于另一个对象创建新的 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 具有与此不同的夏令时偏移量,则结果将与此不同 time-of-day,甚至可能不会在 50 天后到达日历日期。
处理当地时间日期时要小心。
没那么简单。
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
.
在不使用任何库的情况下,您可以添加 Month 和 Year
var date = new DateTime(2021, 1, 29);
加月:-
date = DateTime(date.year, date.month + 1, date.day);
添加年份:-
date = DateTime(date.year + 1, date.month, date.day);
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,
);
}
增加和减少 day/month/year 可以通过 DateTime class
初始化需要显示的日期格式
var _inputFormat = DateFormat('EE, d MMM yyyy');
var _selectedDate = DateTime.now();
增加Day/month/year:
_selectedDate = DateTime(_selectedDate.year,
_selectedDate.month + 1, _selectedDate.day);
增加Day/month/year:
_selectedDate = DateTime(_selectedDate.year,
_selectedDate.month - 1, _selectedDate.day);
以上示例仅针对月份,类似的方式我们可以增减年和日。
非常简单。
DateTime参数根据自己的需要简单的加减即可。
例如-
~ 在这里,我需要从今天开始准确地获得 16 年前的 date-time,即使是几毫秒,并且通过以下方式我得到了我的解决方案。
DateTime today = DateTime.now();
debugPrint("Today's date is: $today"); //Today's date is: 2022-03-17 09:08:33.891843
所需减法后;
DateTime desiredDate = DateTime(
today.year - 16,
today.month,
today.day,
today.hour,
today.minute,
today.second,
today.millisecond,
today.microsecond,
);
debugPrint("18 years before date is: $desiredDate"); // 18 years before date is: 2006-03-17 09:08:33.891843