]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/include/utime_fmt.h
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / include / utime_fmt.h
index 44c9a40cd7b2d0151a2b13e035364cdf237ad54d..e7a98d2097d2b41af390879b94f2247d5a23d1da 100644 (file)
@@ -4,16 +4,23 @@
 /**
  * \file fmtlib formatter for utime_t
  */
-#include <fmt/format.h>
 #include <fmt/chrono.h>
-
-#include <string_view>
+#include <fmt/format.h>
 
 #include "include/utime.h"
 
 template <>
 struct fmt::formatter<utime_t> {
-  constexpr auto parse(format_parse_context& ctx) { return ctx.begin(); }
+  template <typename ParseContext>
+  constexpr auto parse(ParseContext& ctx)
+  {
+    auto it = ctx.begin();
+    if (it != ctx.end() && *it == 's') {
+      short_format = true;
+      ++it;
+    }
+    return it;
+  }
 
   template <typename FormatContext>
   auto format(const utime_t& utime, FormatContext& ctx)
@@ -21,12 +28,20 @@ struct fmt::formatter<utime_t> {
     if (utime.sec() < ((time_t)(60 * 60 * 24 * 365 * 10))) {
       // raw seconds.  this looks like a relative time.
       return fmt::format_to(ctx.out(), "{}.{:06}", (long)utime.sec(),
-                            utime.usec());
+                           utime.usec());
     }
 
     // this looks like an absolute time.
     // conform to http://en.wikipedia.org/wiki/ISO_8601
-    auto asgmt = fmt::gmtime(utime.sec());
-    return fmt::format_to(ctx.out(), "{:%FT%T}.{:06}{:%z}", asgmt, utime.usec(), asgmt);
+    // (unless short_format is set)
+    auto aslocal = fmt::localtime(utime.sec());
+    if (short_format) {
+      return fmt::format_to(ctx.out(), "{:%FT%T}.{:03}", aslocal,
+                           utime.usec() / 1000);
+    }
+    return fmt::format_to(ctx.out(), "{:%FT%T}.{:06}{:%z}", aslocal,
+                         utime.usec(), aslocal);
   }
+
+  bool short_format{false};
 };