diff --git a/src/Core/src/Handlers/DatePicker/DatePickerHandler.Android.cs b/src/Core/src/Handlers/DatePicker/DatePickerHandler.Android.cs index 2979a6ee14e4..5b5c4436ec5c 100644 --- a/src/Core/src/Handlers/DatePicker/DatePickerHandler.Android.cs +++ b/src/Core/src/Handlers/DatePicker/DatePickerHandler.Android.cs @@ -17,15 +17,10 @@ protected override MauiDatePicker CreatePlatformView() HidePicker = HidePickerDialog }; - var date = VirtualView?.Date; - - if (date != null) - _dialog = CreateDatePickerDialog(date.Value.Year, date.Value.Month, date.Value.Day); - return mauiDatePicker; } - internal DatePickerDialog? DatePickerDialog { get { return _dialog; } } + internal DatePickerDialog? DatePickerDialog { get { return _dialog ??= CreateDefaultDatePickerDialog(); } } protected override void ConnectHandler(MauiDatePicker platformView) { @@ -64,6 +59,16 @@ protected override void DisconnectHandler(MauiDatePicker platformView) base.DisconnectHandler(platformView); } + DatePickerDialog? CreateDefaultDatePickerDialog() + { + var date = VirtualView?.Date; + if (date != null) + { + return CreateDatePickerDialog(date.Value.Year, date.Value.Month, date.Value.Day); + } + return null; + } + protected virtual DatePickerDialog CreateDatePickerDialog(int year, int month, int day) { var dialog = new DatePickerDialog(Context!, (o, e) => @@ -73,7 +78,11 @@ protected virtual DatePickerDialog CreateDatePickerDialog(int year, int month, i VirtualView.Date = e.Date; } }, year, month, day); - + if (VirtualView != null) + { + dialog.DatePicker.MaxDate = (long)VirtualView.MaximumDate.ToUniversalTimeNative().Subtract(DateTime.MinValue.AddYears(1969)).TotalMilliseconds; + dialog.DatePicker.MinDate = (long)VirtualView.MinimumDate.ToUniversalTimeNative().Subtract(DateTime.MinValue.AddYears(1969)).TotalMilliseconds; + } return dialog; } diff --git a/src/Core/src/Platform/Android/DatePickerExtensions.cs b/src/Core/src/Platform/Android/DatePickerExtensions.cs index c2319f51cf82..af218e443a12 100644 --- a/src/Core/src/Platform/Android/DatePickerExtensions.cs +++ b/src/Core/src/Platform/Android/DatePickerExtensions.cs @@ -53,6 +53,20 @@ public static void UpdateMaximumDate(this MauiDatePicker platformDatePicker, IDa } } + internal static DateTime ToUniversalTimeNative(this DateTime date) + { + if (date.Kind == DateTimeKind.Utc) + { + return date; + } + var timeZone = Java.Util.TimeZone.Default; + if (timeZone != null && date != DateTime.MaxValue && date != DateTime.MinValue) + { + return date.AddHours(-1 * (double)timeZone.RawOffset / 1000 / 60 / 60); + } + return date.ToUniversalTime(); + } + internal static void SetText(this MauiDatePicker platformDatePicker, IDatePicker datePicker) { platformDatePicker.Text = datePicker.Date.ToString(datePicker.Format);