What is the error in this part of my code that is related to the time in the event calendar app? I'm new to flutter - flutter

What is the error in this part of my code that is related to the time in the event calendar app? I'm new to flutter.
this is my code screen :
[Future pickFromDateTime({required bool pickDate}) async {
final date = await pickDateTime(fromDate, pickDate: pickDate);
}
Future<DateTime?> pickDateTime(
DateTime initialDate, {
required bool pickDate,
DateTime? firstDate,
}) async {
if (pickDate) {
final date = await showDatePicker(
context: context,
initialDate: initialDate,
firstDate: firstDate ?? DateTime(2020, 1),
lastDate: DateTime(2101));
if (date == null) return null;
final time =
Duration(hours: initialDate.hour, minutes: initialDate.minute);
return date.add(time);
} else {
final timeOfDay = await showTimePicker(
context: context, initialTime: TimeOfDay.fromDateTime(initialDate));
if (timeOfDay == null) return null;
final Date = DateTime(initialDate.year, initialDate.month);
final Time =
Duration(hours: initialDate.hour, minutes: initialDate.minute);
return date.add(time);
}
}][1]

Careful with your variable names. You declared those variables as ´Date´ and ´Time´, but you are trying to use them by calling ´date´ and ´time´.
Call your variables with lowercase.
final date = DateTime(initialDate.year, initialDate.month);
final time =
Duration(hours: initialDate.hour, minutes: initialDate.minute);
return date.add(time);

Related

How to retrieve a list of days from a date range || Flutter

i want to take duration in months how to i take
This is my code
labelText: 'End Date',
hintText: ' yyyy-MM-dd'),
onTap: () async {
final int dur = int.parse(durationController.text);
var stDate = DateTime.parse(startDateController.text);
final DateFormat formatter = DateFormat('yyyy-MM-dd');
final String formatted = formatter.format(stDate);
final double days = 31;
final int day = days.toInt();
print(formatted);
DateTime thirtyDaysFromNow =
stDate.add(new Duration(days: dur * day - 7));
print('thirty days $thirtyDaysFromNow');
DateTime? pickedDate = await showDatePicker(
context: context,
initialDate: DateTime.now(),
firstDate: DateTime(1991),
lastDate: DateTime(2101),
).then((pickedDate) {
if (pickedDate != null) {
String formattedDate =
DateFormat('yyyy-MM-dd').format(pickedDate);
print(formattedDate);
setState(() {
endDateController.text = formatter.format(
DateTime.parse(thirtyDaysFromNow.toString()));
});
print(endDateController.text);
} else {
print("Date is not selected");
}
});
}

How to set a default time of 11:59 pm , while selecting endDate using Date picker in Flutter?

My plan is to select 2 dates
start Date
end Date
Where I should get the start date as "20/08/2021 12:00 AM" and end date as "20/08/2021 11:59 PM".
But I am only getting the start Date as "20/08/2021 12:00 AM" not the end Date as "20/08/2021 11:59 PM" , here I am focusing the end Time i.e.,11:59 PM, which is the end time of a day in 12 hour Format, and I am trying to get it by default while picking the end Date.
And for this I already checked the official documentation , I didn't found any resolution.
For reference
https://api.flutter.dev/flutter/intl/DateFormat-class.html
Here is the code
static DateTime nope = DateTime.now();
var selectedStartDate = DateFormat('dd/MM/yyyy hh:mm a');
// var date1 = DateFormat('dd/MM/yyyy').format(nope);
Future<Null> _selectDate(BuildContext context) async {
final DateTime picked = await showDatePicker(
context: context,
initialDate: nope,
firstDate: DateTime(2000, 8),
lastDate: DateTime(2101));
if (picked != null && picked != nope)
setState(() {
nope = picked;
});
startDate.text = selectedStartDate.format(nope);
}
static DateTime yep = DateTime.now();
var selectEndDate = DateFormat('dd/MM/yyyy');
var date2 = DateFormat('dd/MM/yyyy').format(yep);
Future<Null> _selecteddate(BuildContext context) async {
final DateTime pick = await showDatePicker(
context: context,
initialDate: yep,
firstDate: DateTime(2000, 8),
lastDate: DateTime(2101));
if (pick != null && pick != yep)
setState(() {
yep = pick;
});
endDate.text = selectEndDate.format(yep);
}
Here is the output, how I am getting from the above code
Please do help me in searching the solution and Thanks in advance 😀.
Maybe replace
var selectEndDate = DateFormat('dd/MM/yyyy');
with
var selectEndDate = DateFormat('dd/MM/yyyy hh:mm a');
I'm building a POS project now, So I had the same Start Date and End Date Fields in my Tax and other Reports sections. When I faced the same issue I fixed it by adding 23 hours and 59 minutes to the selected date.
I use the below Class to pick a date throughout my application
class DateTimeUtils {
//========== Singleton Instance ==========
DateTimeUtils._internal();
static DateTimeUtils instance = DateTimeUtils._internal();
factory DateTimeUtils() {
return instance;
}
//========== Date Picker ==========
Future<DateTime?> datePicker(BuildContext context, {final DateTime? initDate, final bool endDate = false}) async {
final DateTime? selectedDate = await showDatePicker(
context: context,
initialDate: initDate ?? DateTime.now(),
firstDate: DateTime(1998, 04, 14),
lastDate: DateTime.now(),
);
if (selectedDate != null && endDate) {
final DateTime updated = selectedDate.add(const Duration(hours: 23, minutes: 59));
return updated;
} else {
return selectedDate;
}
}
}
Can be called from anywhere in the project like below
final _selectedDate = await DateTimeUtils.instance.datePicker(context, initDate: toDate, endDate: true);

DateTime from date and time picker

I have a date and time picker:
Future<void> _showDatePicker(BuildContext context) async {
final picked = await showDatePicker(
context: context,
initialDate: _fromDate,
firstDate: DateTime(1000, 1),
lastDate: DateTime(2200),
);
print(picked);
if (picked != null && picked != _fromDate) {
setState(() {
_fromDate = picked;
});
}
}
Future<void> _showTimePicker(BuildContext context) async {
final picked = await showTimePicker(
context: context,
initialTime: _fromTime,
);
print(picked);
if (picked != null && picked != _fromTime) {
setState(() {
_fromTime = picked;
});
}
}
When I pick a date, the result is 2021-03-10 00:00:00.000 and when I pick a time, the result is TimeOfDay(22:12).
How do I combine both of them to have 2021-03-10 22:12:00.000. That's what I want to save to my database.
And how do I remove the three trailing zeros from the date 2021-03-10 00:00:00.000 of so it can look like this --> 2021-03-10 00:00:00 when displaying it in a Text() widget?
After selecting the date and time, you must generate a new datetime object in this way.
DateTime _fromDate = new DateTime.now();
TimeOfDay _fromTime = new TimeOfDay.now();
DateTime newDateTime = new DateTime(_fromDate.year, _fromDate.month,
_fromDate.day, _fromTime.hour, _fromTime.minute);
Then use the intl package to format the date to the string you want.
String dateTimeFormated = DateFormat('yyyy-MM-dd H:mm:ss').format(newDateTime);
print(dateTimeFormated);
Result will be a string similar to this
2021-03-10 22:12:00

how to compare showdatepicker + showtimepicker results with current date (datetime.now())

I can get the date time values with date and time picker. I want to combine the date and time values ​​I have obtained and compare them with the current date (DateTime.now() format).
How can I do it?
Future _selectDayAndTime(BuildContext context) async {
DateTime _selectedDay = await showDatePicker(
context: context,
initialDate: _date ?? DateTime.now(),
firstDate: DateTime(2020),
lastDate: DateTime(2100),
builder: (BuildContext context, Widget child) => child
);
TimeOfDay _selectedTime = await showTimePicker(
context: context,
initialTime: _time ?? TimeOfDay.now(),
);
if(_selectedDay != null && _selectedTime != null) {
setState(() {
_date = _selectedDay;
_time = _selectedTime;
});
debugPrint("Day result : $_date");
debugPrint("Time result : $_time");
}
}
Result
I/flutter ( 9596): Day result : 2020-01-16 00:00:00.000
I/flutter ( 9596): Time result : TimeOfDay(18:30)
TimeOfDay holds only hour and minutes. showDatePicker() returns a DateTime object, although it contains only year, month and day which are meaningful. You may update this DateTime object's hour and minutes with that of TimeofDay.
A vague code would as shown below.
var _date = _selectedDay;
var _time = _selectedTime;
var updatedDateTime = new DateTime(_date.year, _date.month, _date.day, _time.hour, _time.minute, _date.second);
And now, you can use standart DateTime class methods, to compare this updatedDateTime with DateTime.now().
This might help you :
var date = DateTime.now();
var time = TimeOfDay(hour: 12, minute: 00);
// Combined DateTime and TimeOfDay
var pickedTime = DateTime(date.year, date.month, date.day, time.hour, time.minute);
// returns -1 if pickedTime is before, 1 if after, 0 if equal.
var comparison = pickedTime.compareTo(date);
// time between now and the time of day.
var duration = Duration(milliseconds: date.millisecondsSinceEpoch - pickedTime.millisecondsSinceEpoch);

Flutter - Convert 24 hour format to 12 hour format

I'm getting time using showTimePicker().
TimeOfDay _selectedTime;
Future<Null> _selectTime(BuildContext context) async {
final TimeOfDay timePicked = await showTimePicker(
context: context,
initialTime: TimeOfDay.now(),
);
if (timePicked != null)
setState(() {
_selectedTime = timePicked;
});
}
But here _selectedTime is in 24-hour format. Suppose if I select 3.00 PM then it shows 15.00 i.e. it's in 24-hour format.
How can I convert this time into 12-hour format? i.e It should show me 3.00 PM and not 15.00.
I can write the logic to convert it. But is there anything built in to do so?
You can use hourOfPeriod property of TimeofDay to return to you the hour in 12-hour format. That, of course, will be without the AM - PM ending :
TimeOfDay _selectedTime;
Future<Null> _selectTime(BuildContext context) async {
final TimeOfDay timePicked = await showTimePicker(
context: context,
initialTime: TimeOfDay.now(),
);
if (timePicked != null)
setState(() {
_selectedTime = timePicked.replacing(hour: timePicked.hourOfPeriod);
});
print(_selectedTime.toString());
}
Use DateFormat to convert time to 12 hours format with AM & PM
TimeOfDay? _selectedTime;
Future<Null> _selectTime(BuildContext context) async {
final TimeOfDay? timePicked = await showTimePicker(
context: context,
initialTime: TimeOfDay.now(),
);
if (timePicked != null)
setState(() {
_selectedTime = timePicked;
});
// Conversion logic starts here
DateTime tempDate = DateFormat("hh:mm").parse(
_selectedTime!.hour.toString() +
":" + _selectedTime!.minute.toString());
var dateFormat = DateFormat("h:mm a"); // you can change the format here
print(dateFormat.format(tempDate));
}
Output:
flutter: 8:00 PM
flutter: 1:00 AM
flutter: 6:00 PM
I have created a extension for parsing TimeOfDay to 12 hr format
extension TimeOfDayExtensions on TimeOfDay {
String format12Hour(BuildContext context) {
TimeOfDay time = replacing(hour: this.hourOfPeriod);
MaterialLocalizations localizations = MaterialLocalizations.of(context);
final StringBuffer buffer = StringBuffer();
buffer
..write(time.format(context))
..write(' ')
..write(period == DayPeriod.am
? localizations.anteMeridiemAbbreviation
: localizations.postMeridiemAbbreviation);
return '$buffer';
}
You can use like
pickedTime?.format12Hour(context);
i used jiffy to get 12 hour format and the am/pm
_selectTime(BuildContext context) async {
final TimeOfDay? timeOfDay = await showTimePicker(
context: context,
initialTime: TimeOfDay.now(),
initialEntryMode: TimePickerEntryMode.input,
hourLabelText: LocalizationKeys.hour.tr,
minuteLabelText: LocalizationKeys.minute.tr,
);
if (timeOfDay != null) {
DateTime dateTime = DateTime(DateTime.now().year, DateTime.now().month,
DateTime.now().day, timeOfDay.hour, timeOfDay.minute);
var jiffy = Jiffy(dateTime);
var format = jiffy.format("hh:mm a");
_lecturesViewModel.selectedTime.value = format;
}