게임 엔진/Unreal

[Unreal] [DateTime] 시간 관리 구조체

AlgorFati 2023. 9. 5. 00:48

DateTime

DateTime은 언리얼에서 시간을 관리하기 위해 사용하는 구조체이다.

다음과 같이 현재 시간에 대한 정보를 얻을 수 있다.

FDateTime CurrentTimestamp = FDateTime::Now();

 

얻은 타임스탬프를 초로 환산하고 싶은 경우 다음과 같이 한다.

FDateTime CurrentTimestamp = FDateTime::Now();
FDateTime UnixEpochTime = FDateTime(1970, 1, 1);
double TotalMilliseconds = (CurrentTimestamp - UnixEpochTime).GetTotalMilliseconds();

 

두 타임스탬프를 비교하고 싶은 경우 둘 다 초로 환산하여 비교하면 된다. 

타임스탬프를 직접 비교하는 경우 원하는 결과가 나오지 않을 수 있다. (Comp1 : false    Comp2 : true)

 

FDateTime InLastTimestamp = FDateTime(1970, 1, 2);
FDateTime InCurrentTimestamp = FDateTime(1970, 1, 3);

bool bComp1 = InLastTimestamp < InCurrentTimestamp;

double A = (InLastTimestamp - UnixEpochTime).GetTotalMilliseconds();
double B = (InCurrentTimestamp - UnixEpochTime).GetTotalMilliseconds();
bool bComp2 = A < B;

UE_LOG(LogTemp, Error, TEXT("%s    %s    Comp1 : %d   Comp2 : %d"),
    *InLastTimestamp.ToString(),
    *InCurrentTimestamp.ToString(),
    (int32)(bComp1),
    (int32)(bComp2));

 

다음과 같이 문자열에서 파싱도 가능하다.

FString OutTimestampText = TEXT("2023-09-04 05:56:31.185");
FDateTime OutTimestamp;

if (FDateTime::Parse(OutTimestampText, OutTimestamp))
{
    // Successfully parsed the timestamp
    int32 Year = ParsedDateTime.GetYear();
    int32 Month = ParsedDateTime.GetMonth();
    int32 Day = ParsedDateTime.GetDay();
    int32 Hour = ParsedDateTime.GetHour();
    int32 Minute = ParsedDateTime.GetMinute();
    int32 Second = ParsedDateTime.GetSecond();
    int32 Millisecond = ParsedDateTime.GetMillisecond();

    UE_LOG(LogTemp, Warning, TEXT("Year: %d"), Year);
    UE_LOG(LogTemp, Warning, TEXT("Month: %d"), Month);
    UE_LOG(LogTemp, Warning, TEXT("Day: %d"), Day);
    UE_LOG(LogTemp, Warning, TEXT("Hour: %d"), Hour);
    UE_LOG(LogTemp, Warning, TEXT("Minute: %d"), Minute);
    UE_LOG(LogTemp, Warning, TEXT("Second: %d"), Second);
    UE_LOG(LogTemp, Warning, TEXT("Millisecond: %d"), Millisecond);
}
else
{
    // Failed to parse the timestamp
    UE_LOG(LogTemp, Error, TEXT("Failed to parse timestamp: %s"), *TimestampString);
}