Błąd w parsowaniu daty pobranej z API

0

Witam serdecznie. Przy pobieraniu danych z API otrzymuję wyjątek:
the added or subtracted value results in an un-representable datetime

Oto model w mojej aplikacji:

public class WorkTimeModel
    {
        public Guid Id { get; set; }
        [JsonProperty("ApplicationUser")]
        public ApplicationUser User { get; set; }
        public DateTime StartTime { get; set; }
        public DateTime? EndTime { get; set; }
        public ePlaceType PlaceType { get; set; }
        [JsonProperty("PlaceCar")]
        public Place_CarModel Car { get; set; }
        [JsonProperty("PlaceOffice")]
        public Place_OfficeModel Office { get; set; }

        public double GetWorkTimeProgressProcentage(TimeSpan WorkTime)
        {
            DateTime maxWorkDate = StartTime.AddTicks(WorkTime.Ticks).AddTicks(-StartTime.Ticks);
            DateTime now = DateTime.Now.AddTicks(-StartTime.Ticks);
            return (now.Ticks * 100) / maxWorkDate.Ticks;
        }
    }

A tutaj zwrotka z mojego API:

{
    "Success": true,
    "Error": "",
    "Data": {
        "Id": "ed34302e-efef-454c-9afa-5e1d93863bfb",
        "ApplicationUserId": "782wcea0-29bc-4167-a820-7d7cbe010154",
        "ApplicationUser": {
            "Id": "782wcea0-29bc-4167-a820-7d7cbe010154",
            "Login": "login",
            "Password": "haslo",
            "FirstName": "Jan",
            "LastName": "Kowalski",
            "Roles": "{\"Values\":[\"Technician\",\"Officeman\",\"Warehouseman\"]}",
            "Token": "56w6a2f4-862d-4d27-a673-610g8301cfba",
            "IsDeleted": false
        },
        "StartTime": "2021-11-08T12:36:55.6649463",
        "EndTime": null,
        "PlaceType": 0,
        "PlaceCarId": "70686183-1659-4fb2-9775-052e6bc59429",
        "PlaceCar": {
            "Id": "70686183-1659-4fb2-9775-052e6bc59429",
            "PlaceName": "Opel Astra",
            "RegistrationNumber": "GDA LD908",
            "QrCode": "car1"
        },
        "PlaceOfficeId": null,
        "PlaceOffice": null
    }
}

Co może być nie tak?

2

Ale wywala się na StartDate czy EndDate?
Jeśli to pierwsze, to pewnie jakieś ustawienia regionalne, jeśli to drugie, to nie rozumie nulla.

0

Wyrzuciłem ten kod poza try catch i aplikacja się nie wywala i nie dostaje żadnego wyjątku. jak to możliwe?

CurrentWorkTime = await workTimeService.GetCurrentWorkTime(CurrentUser);
if (CurrentWorkTime != null && !CurrentWorkTime.EndTime.HasValue)
     StartWorkTimer();

@somekind : Nie mam możliwości sprawdzenia tego :(

0

Update:
Udało mi się ustalić miejsce wystąpienia wyjątku:
Metoda StartWorkTimer();

public void StartWorkTimer()
        {
            UpdateWorkTimeProgressBar();
            Device.StartTimer(new TimeSpan(0, 0, 30), () =>
            {
                if (CurrentWorkTime != null && !CurrentWorkTime.EndTime.HasValue)
                {
                    StartWorkTimer();
                }
                return false;
            });
        }

Wywoływana metoda: UpdateWorkTimeProgressBar

public void UpdateWorkTimeProgressBar()
        {
            if(CurrentWorkTime != null)
            {
                double progress = CurrentWorkTime.GetWorkTimeProgressProcentage(new TimeSpan(0, 10, 0));
                WorkTimespanProgress = (float)progress / (float)100.00f;
            }
        }

Metoda GetWorkTimeProgressProcentage z WorkTimeModel:

public double GetWorkTimeProgressProcentage(TimeSpan WorkTime)
        {
            Debug.WriteLine($"GetWorkTimeProgressProcentage - maxWorkDate");
            DateTime maxWorkDate = StartTime.AddTicks(WorkTime.Ticks).AddTicks(-StartTime.Ticks);
            Debug.WriteLine($"GetWorkTimeProgressProcentage - now");
            DateTime now = DateTime.Now.AddTicks(-StartTime.Ticks);
            Debug.WriteLine($"GetWorkTimeProgressProcentage - return");
            return (now.Ticks * 100) / maxWorkDate.Ticks;
        }

W tej metodzie konsola wywala mi:

[0:] GetWorkTimeProgressProcentage - maxWorkDate
[0:] GetWorkTimeProgressProcentage - now (max work date = 01.01.0001 00:10:00)

Wszystko jasne. W telefonie jestem o godzinę do tyłu w stosunku do serwera. Jak można wymusić dopasowanie godziny serwera i aplikacji?
Metoda GetWorkTimeProgressProcentage(TimeSpan WorkTime) ma ustawiać wartość dla ProgressBaru sygnalizującego postęp czasu między rozpoczęciem a zakończeniem pracy przy założeniu, że czas pracy będzie wynosić WorkTime? Jedyne co mi przychodzi na myśl, to odpytywać za każdym razem API które będzie to obliczać. Nie da się tego zrobić offline?

1

Rozwiązanie:

public double GetWorkTimeProgressProcentage(TimeSpan WorkTime)
        {
            DateTime maxWorkDateTime = StartTime.Add(WorkTime);
            if (DateTime.Now >= maxWorkDateTime)
                return 100;
            if (DateTime.Now <= StartTime)
                return 0;
            DateTime now = DateTime.Now.AddTicks(-StartTime.Ticks);
            return (now.Ticks * 100) / maxWorkDateTime.Ticks;
        }

Dzięki @somekind za podsunięcie rozwiązania :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1