Błąd w parsowaniu daty pobranej z API

Błąd w parsowaniu daty pobranej z API
G1
  • Rejestracja:ponad 4 lata
  • Ostatnio:5 dni
  • Postów:506
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:

Kopiuj
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:

Kopiuj
{
    "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?

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:dzień
  • Lokalizacja:Wrocław
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.

G1
  • Rejestracja:ponad 4 lata
  • Ostatnio:5 dni
  • Postów:506
0

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

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

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

edytowany 2x, ostatnio: gswidwa1
G1
  • Rejestracja:ponad 4 lata
  • Ostatnio:5 dni
  • Postów:506
0

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

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

Wywoływana metoda: UpdateWorkTimeProgressBar

Kopiuj
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:

Kopiuj
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:

Kopiuj
[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?

G1
  • Rejestracja:ponad 4 lata
  • Ostatnio:5 dni
  • Postów:506
1

Rozwiązanie:

Kopiuj
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 :)

edytowany 1x, ostatnio: gswidwa1

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.