Parsowanie daty z formatem am/pm

0

jak zamienić std::string str= "7/20/2023 9:31:30 AM" na TDateTime?
jak powinien wyglądać format dla tego typu daty aby zadziałała funkcja StrToDateTime?

2

W jakim języku piszesz program? TDateTime to jest w Pascalu, ale zapis std::string str= "7/20/2023 9:31:30 AM" to jest raczej C++. Chyba zaszła jakaś pomyłka.

Pomijając powyższe, jednym z uniwersalnych sposobów jest przetworzenie znak po znaku, żeby wypisać same liczby do listy w ten sposób, że poczynając od pustej listy:

  1. Dodaj do listy jeden pusty string
  2. Dla każdego znaku ciągu wejściowego:
    2.1. Jeżeli cyfra, to dopisz jako kolejny znak do ostatniej pozycji na liście.
    2.2. Jeżeli nie-cyfra i ostatnia pozycja na liście nie jest pusta, to dodaj do listy pusty string.

Dostaniesz listę z liczbami w formie tekstowej, pozycja na liście wskazuje, którą częścią daty jest dana liczba. Jeszcze dodatkowo należy sprawdzić, czy w ciągu wejściowym jest słówko "AM", czy "PM".

Mając tą listę, możesz od podstaw zbudować obiekt TDateTime wykorzystując te liczby zamieniają je w locie ze string na integer.

Tu opis, w jakiej formie przyjmuje StrToDateTime:
https://docwiki.embarcadero.com/Libraries/Alexandria/en/System.SysUtils.StrToDateTime
StrToDateTime
https://www.delphibasics.co.uk/RTL.php?Name=StrToDateTime

Widocznie przyjmuje różne formaty, celem jest przerobienie string na najbliższy, ale akceptowany format.

Jeżeli StrToDateTime akceptuje format '23/02/2075 1256' (nie mam możliwości tego sprawdzić), to obcinasz 3 ostatnie znaki i wykonujesz jedną z czynności na cyfrze godzin po utworzeniu obiektu TDateTime:

  1. Jeżeli jest " AM" i godzina = 12, to odejmujesz 12.
  2. Jeżeli jest " PM" i godzina <> 12, to dodajesz 12.
  3. W pozostałych przypadkach nic nie zmieniasz.
0

std::string - na pewno mówimy o Delphi?

5

W Delphi to by było zwyczajnie:

var
  fs: TFormatSettings;
  sDateTime: string;
begin
  fs:= TFormatSettings.Create('en-US');
  sDateTime:= DateTimeToStr(StrToDateTime('7/20/2023 9:31:30 AM', fs));
  ShowMessage(sDateTime);
end;
0

@andrzejlisek:

Bardzo po bandzie pojechałeś z propozycją

@kAzek:

+1

0

Przepraszam, rzeczywistsze pomieszałem bo podałem kod w C++ (ostatnio rzadko jest Pascal)
@andrzejlisek: rozwiazanie pewnie by i zadziałało ale narobić się trzeba , a jest wszak gotowa funkcja tylko trzeba podać odpowiedni parametr formatu,
bardziej chodziło mi o to rozwiązanie by @kAzek:

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