1#ifdef NNSDK
2#include <nn/time.h>
3#else
4#error "Unknown platform"
5#endif
6
7#include "basis/seadRawPrint.h"
8#include "time/seadDateTime.h"
9#include "time/seadDateUtil.h"
10
11namespace sead
12{
13DateTimeUtc::DateTimeUtc(u64 unix_time)
14{
15 mUnixTime = unix_time;
16}
17
18DateTimeUtc::DateTimeUtc(const DateTime& date_time)
19{
20 CalendarTime time;
21 date_time.getCalendarTime(time: &time);
22
23#ifdef NNSDK
24 // Note: time sysmodule is not initialised here.
25 nn::time::CalendarTime nn_time;
26 nn_time.year = time.getYear();
27 nn_time.month = time.getMonth().getValueOneOrigin();
28 nn_time.day = time.getDay();
29 nn_time.hour = time.getHour();
30 nn_time.minute = time.getMinute();
31 nn_time.second = time.getSecond();
32 nn::time::PosixTime posix_time;
33 int dummy = 0;
34 nn::time::ToPosixTime(&dummy, &posix_time, 1, nn_time);
35 mUnixTime = posix_time.time;
36#endif
37}
38
39DateTimeUtc::DateTimeUtc(const CalendarTime& time)
40{
41 setUnixTime(time);
42}
43
44DateTimeUtc::DateTimeUtc(const CalendarTime::Year& year, const CalendarTime::Month& month,
45 const CalendarTime::Day& day, const CalendarTime::Hour& hour,
46 const CalendarTime::Minute& minute, const CalendarTime::Second& second)
47{
48 setUnixTime(year, month, day, hour, minute, second);
49}
50
51u64 DateTimeUtc::setNow()
52{
53#ifdef NNSDK
54 DateTime::initializeSystemTimeModule();
55 nn::time::PosixTime now;
56 nn::time::StandardUserSystemClock::GetCurrentTime(&now);
57 mUnixTime = now.time;
58#endif
59 return mUnixTime;
60}
61
62u64 DateTimeUtc::setUnixTime(const CalendarTime& time)
63{
64#ifdef NNSDK
65 DateTime::initializeSystemTimeModule();
66 nn::time::CalendarTime nn_time;
67 nn_time.year = time.getYear();
68 nn_time.month = time.getMonth().getValueOneOrigin();
69 nn_time.day = time.getDay();
70 nn_time.hour = time.getHour();
71 nn_time.minute = time.getMinute();
72 nn_time.second = time.getSecond();
73 mUnixTime = nn::time::ToPosixTimeFromUtc(nn_time).time;
74#endif
75 return mUnixTime;
76}
77
78u64 DateTimeUtc::setUnixTime(const CalendarTime::Year& year, const CalendarTime::Month& month,
79 const CalendarTime::Day& day, const CalendarTime::Hour& hour,
80 const CalendarTime::Minute& minute, const CalendarTime::Second& second)
81{
82 DateTime::initializeSystemTimeModule();
83 CalendarTime time(year, month, day, hour, minute, second);
84#ifdef NNSDK
85 nn::time::CalendarTime nn_time;
86 nn_time.year = time.getYear();
87 nn_time.month = time.getMonth().getValueOneOrigin();
88 nn_time.day = time.getDay();
89 nn_time.hour = time.getHour();
90 nn_time.minute = time.getMinute();
91 nn_time.second = time.getSecond();
92 mUnixTime = nn::time::ToPosixTimeFromUtc(nn_time).time;
93#endif
94 return mUnixTime;
95}
96
97void DateTimeUtc::getCalendarTime(CalendarTime* out) const
98{
99#ifdef NNSDK
100 DateTime::initializeSystemTimeModule();
101 const nn::time::CalendarTime ctime = nn::time::ToCalendarTimeInUtc({.time: mUnixTime});
102
103 CalendarTime::Date date(ctime.year, CalendarTime::Month::makeFromValueOneOrigin(month: ctime.month),
104 ctime.day);
105 CalendarTime::Time time(ctime.hour, ctime.minute, ctime.second);
106#endif
107
108 out->setDate(date);
109 out->setTime(time);
110}
111
112DateSpan DateTimeUtc::diff(DateTimeUtc time) const
113{
114 return DateSpan(mUnixTime - time.mUnixTime);
115}
116
117DateSpan DateTimeUtc::diffToNow() const
118{
119 DateTimeUtc now(0);
120 now.setNow();
121 return now.diff(time: *this);
122}
123
124DateSpan operator-(DateTimeUtc lhs, DateTimeUtc rhs)
125{
126 return DateSpan(lhs.getUnixTime() - rhs.getUnixTime());
127}
128
129DateTimeUtc operator-(DateTimeUtc time, DateSpan span)
130{
131 return DateTimeUtc(time.getUnixTime() - span.getSpan());
132}
133
134DateTimeUtc operator+(DateTimeUtc time, DateSpan span)
135{
136 return DateTimeUtc(time.getUnixTime() + span.getSpan());
137}
138} // namespace sead
139