如何验证 DateTime 以便结束日期不能早于开始日期?
How to validate DateTime so that end date cannot be before start date?
我制作了一个提供所选日期值的自定义小部件,因此我一直在使用两个具有 showDatePicker 函数的文本字段(这是我的自定义小部件),我尝试使用函数 showDatePicker 的参数 firstdate作为第二个文本字段的参数,即结束日期,所以我需要验证如果用户选择了开始日期,那么结束日期不能早于开始日期,这两个日期的值都分配给了我与提供者管理的变量。我将响应作为字符串接收,然后转换这两个值以与 isBefore 或 isAfter 进行比较。
自定义控件
class _DateFilterState extends State<_DateFilter> {
final TextEditingController _textEditingController = TextEditingController();
@override
Widget build(BuildContext context) {
return TextField(
enableInteractiveSelection: false,
decoration: InputDecoration(labelText: widget.title),
focusNode: AlwaysDisabledFocusNode(),
controller: _textEditingController,
onTap: () {
_selectDate(context);
setState(() {});
},
);
}
_selectDate(context) async {
DateTime? selectedDate = await showDatePicker(
context: context,
initialDate: widget.initialDate,
firstDate: widget.firstDate ?? DateTime(2015),
lastDate: widget.lastDate ?? DateTime.now(),
);
if (selectedDate != null) {
_textEditingController.text = DateFormat('dd/MM/yyyy').format(selectedDate);
widget.onChanged(_textEditingController.text);
}
}
}
验证结束日期
Row(
children: [
Flexible(
child: _DateFilter(
onChanged: (value) => authsProvider.dateStart = value,
title: 'Start date',
initialDate: DateTime.now(),
)),
const SizedBox(width: 10),
Flexible(
child: _DateFilter(
title: 'End date',
onChanged: (value) => authsProvider.dateEnd = value,
initialDate: DateTime.now(),
firstDate: provider.dateSelected =
provider.dateStart.isNotEmpty && formatter.parse(authsProvider.dateEnd).isAfter(formatter.parse(provider.dateStart))
? formatter.parse(provider.dateStart)
: DateTime(2015),
lastDate: DateTime.now(),
)),
有谁知道如何正确验证?我很困惑,我知道还有其他方法可以更好地管理日期范围,但它们是必需的。
你应该使用 DateTime。
DateTime dateStart = DateTime.now(); //YOUR DATE GOES HERE
DateTime dateEnd = DateTime.now(); // YOUR DATE GOES HERE
bool isValidDate = dateStart.isBefore(dateEnd);
我制作了一个提供所选日期值的自定义小部件,因此我一直在使用两个具有 showDatePicker 函数的文本字段(这是我的自定义小部件),我尝试使用函数 showDatePicker 的参数 firstdate作为第二个文本字段的参数,即结束日期,所以我需要验证如果用户选择了开始日期,那么结束日期不能早于开始日期,这两个日期的值都分配给了我与提供者管理的变量。我将响应作为字符串接收,然后转换这两个值以与 isBefore 或 isAfter 进行比较。
自定义控件
class _DateFilterState extends State<_DateFilter> {
final TextEditingController _textEditingController = TextEditingController();
@override
Widget build(BuildContext context) {
return TextField(
enableInteractiveSelection: false,
decoration: InputDecoration(labelText: widget.title),
focusNode: AlwaysDisabledFocusNode(),
controller: _textEditingController,
onTap: () {
_selectDate(context);
setState(() {});
},
);
}
_selectDate(context) async {
DateTime? selectedDate = await showDatePicker(
context: context,
initialDate: widget.initialDate,
firstDate: widget.firstDate ?? DateTime(2015),
lastDate: widget.lastDate ?? DateTime.now(),
);
if (selectedDate != null) {
_textEditingController.text = DateFormat('dd/MM/yyyy').format(selectedDate);
widget.onChanged(_textEditingController.text);
}
}
}
验证结束日期
Row(
children: [
Flexible(
child: _DateFilter(
onChanged: (value) => authsProvider.dateStart = value,
title: 'Start date',
initialDate: DateTime.now(),
)),
const SizedBox(width: 10),
Flexible(
child: _DateFilter(
title: 'End date',
onChanged: (value) => authsProvider.dateEnd = value,
initialDate: DateTime.now(),
firstDate: provider.dateSelected =
provider.dateStart.isNotEmpty && formatter.parse(authsProvider.dateEnd).isAfter(formatter.parse(provider.dateStart))
? formatter.parse(provider.dateStart)
: DateTime(2015),
lastDate: DateTime.now(),
)),
有谁知道如何正确验证?我很困惑,我知道还有其他方法可以更好地管理日期范围,但它们是必需的。
你应该使用 DateTime。
DateTime dateStart = DateTime.now(); //YOUR DATE GOES HERE
DateTime dateEnd = DateTime.now(); // YOUR DATE GOES HERE
bool isValidDate = dateStart.isBefore(dateEnd);