Browse Source

LibCore: Allow formatting a DateTime in GMT

HTTP dates are always expressed in GMT, so add an API to support that
behaviour.
Shannon Booth 1 year ago
parent
commit
b169ffd1cf
2 changed files with 17 additions and 6 deletions
  1. 9 4
      Userland/Libraries/LibCore/DateTime.cpp
  2. 8 2
      Userland/Libraries/LibCore/DateTime.h

+ 9 - 4
Userland/Libraries/LibCore/DateTime.cpp

@@ -122,10 +122,15 @@ void DateTime::set_date(Core::DateTime const& other)
     set_time(other.year(), other.month(), other.day(), hour(), minute(), second());
 }
 
-ErrorOr<String> DateTime::to_string(StringView format) const
+ErrorOr<String> DateTime::to_string(StringView format, LocalTime local_time) const
 {
     struct tm tm;
-    localtime_r(&m_timestamp, &tm);
+
+    if (local_time == LocalTime::Yes)
+        localtime_r(&m_timestamp, &tm);
+    else
+        gmtime_r(&m_timestamp, &tm);
+
     StringBuilder builder;
     size_t const format_len = format.length();
 
@@ -315,9 +320,9 @@ ErrorOr<String> DateTime::to_string(StringView format) const
     return builder.to_string();
 }
 
-ByteString DateTime::to_byte_string(StringView format) const
+ByteString DateTime::to_byte_string(StringView format, LocalTime local_time) const
 {
-    return MUST(to_string(format)).to_byte_string();
+    return MUST(to_string(format, local_time)).to_byte_string();
 }
 
 Optional<DateTime> DateTime::parse(StringView format, StringView string)

+ 8 - 2
Userland/Libraries/LibCore/DateTime.h

@@ -33,8 +33,14 @@ public:
     void set_time(int year, int month = 1, int day = 1, int hour = 0, int minute = 0, int second = 0);
     void set_time_only(int hour, int minute, Optional<int> second = {});
     void set_date(Core::DateTime const& other);
-    ErrorOr<String> to_string(StringView format = "%Y-%m-%d %H:%M:%S"sv) const;
-    ByteString to_byte_string(StringView format = "%Y-%m-%d %H:%M:%S"sv) const;
+
+    enum class LocalTime {
+        Yes,
+        No,
+    };
+
+    ErrorOr<String> to_string(StringView format = "%Y-%m-%d %H:%M:%S"sv, LocalTime = LocalTime::Yes) const;
+    ByteString to_byte_string(StringView format = "%Y-%m-%d %H:%M:%S"sv, LocalTime = LocalTime::Yes) const;
 
     static DateTime create(int year, int month = 1, int day = 1, int hour = 0, int minute = 0, int second = 0);
     static DateTime now();