changeset 2475:8cc3ca64a534

Orthanc now uses UTC (universal time) instead of local time in its database
author Sebastien Jodogne <s.jodogne@gmail.com>
date Mon, 19 Feb 2018 16:55:05 +0100
parents 0c57f40e2fbf
children 6c2c59c824a9 8437607835ef
files Core/DicomParsing/DicomDirWriter.cpp Core/DicomParsing/DicomDirWriter.h Core/SystemToolbox.cpp Core/SystemToolbox.h NEWS OrthancServer/OrthancRestApi/OrthancRestAnonymizeModify.cpp OrthancServer/OrthancRestApi/OrthancRestSystem.cpp OrthancServer/ServerIndex.cpp OrthancServer/ServerIndexChange.h UnitTestsSources/UnitTestsMain.cpp
diffstat 10 files changed, 75 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/Core/DicomParsing/DicomDirWriter.cpp	Thu Feb 08 11:51:41 2018 +0100
+++ b/Core/DicomParsing/DicomDirWriter.cpp	Mon Feb 19 16:55:05 2018 +0100
@@ -128,6 +128,7 @@
   class DicomDirWriter::PImpl
   {
   private:
+    bool                       utc_;
     std::string                fileSetId_;
     bool                       extendedSopClass_;
     TemporaryFile              file_;
@@ -259,11 +260,23 @@
 
   public:
     PImpl() :
+      utc_(true),   // By default, use UTC (universal time, not local time)
       fileSetId_("ORTHANC_MEDIA"),
       extendedSopClass_(false)
     {
     }
+    
+    bool IsUtcUsed() const
+    {
+      return utc_;
+    }
 
+
+    void SetUtcUsed(bool utc)
+    {
+      utc_ = utc;
+    }
+    
     void EnableExtendedSopClass(bool enable)
     {
       if (enable)
@@ -297,7 +310,7 @@
       // cf. "DicomDirInterface::buildStudyRecord()"
 
       std::string nowDate, nowTime;
-      SystemToolbox::GetNowDicom(nowDate, nowTime);
+      SystemToolbox::GetNowDicom(nowDate, nowTime, utc_);
 
       std::string studyDate;
       if (!GetUtf8TagValue(studyDate, dicom, encoding, DCM_StudyDate) &&
@@ -496,6 +509,16 @@
     }
   }
 
+  void DicomDirWriter::SetUtcUsed(bool utc)
+  {
+    pimpl_->SetUtcUsed(utc);
+  }
+  
+  bool DicomDirWriter::IsUtcUsed() const
+  {
+    return pimpl_->IsUtcUsed();
+  }
+
   void DicomDirWriter::SetFileSetId(const std::string& id)
   {
     pimpl_->SetFileSetId(id);
--- a/Core/DicomParsing/DicomDirWriter.h	Thu Feb 08 11:51:41 2018 +0100
+++ b/Core/DicomParsing/DicomDirWriter.h	Mon Feb 19 16:55:05 2018 +0100
@@ -50,6 +50,10 @@
 
     ~DicomDirWriter();
 
+    void SetUtcUsed(bool utc);
+
+    bool IsUtcUsed() const;
+
     void SetFileSetId(const std::string& id);
 
     void Add(const std::string& directory,
--- a/Core/SystemToolbox.cpp	Thu Feb 08 11:51:41 2018 +0100
+++ b/Core/SystemToolbox.cpp	Mon Feb 19 16:55:05 2018 +0100
@@ -561,17 +561,30 @@
   }
 
 
-  std::string SystemToolbox::GetNowIsoString()
+  static boost::posix_time::ptime GetNow(bool utc)
   {
-    boost::posix_time::ptime now = boost::posix_time::second_clock::local_time();
-    return boost::posix_time::to_iso_string(now);
+    if (utc)
+    {
+      return boost::posix_time::second_clock::universal_time();
+    }
+    else
+    {
+      return boost::posix_time::second_clock::local_time();
+    }
+  }
+
+
+  std::string SystemToolbox::GetNowIsoString(bool utc)
+  {
+    return boost::posix_time::to_iso_string(GetNow(utc));
   }
 
   
   void SystemToolbox::GetNowDicom(std::string& date,
-                                  std::string& time)
+                                  std::string& time,
+                                  bool utc)
   {
-    boost::posix_time::ptime now = boost::posix_time::second_clock::local_time();
+    boost::posix_time::ptime now = GetNow(utc);
     tm tm = boost::posix_time::to_tm(now);
 
     char s[32];
--- a/Core/SystemToolbox.h	Thu Feb 08 11:51:41 2018 +0100
+++ b/Core/SystemToolbox.h	Mon Feb 19 16:55:05 2018 +0100
@@ -95,9 +95,10 @@
 
     std::string GenerateUuid();
 
-    std::string GetNowIsoString();
+    std::string GetNowIsoString(bool utc);
 
     void GetNowDicom(std::string& date,
-                     std::string& time);
+                     std::string& time,
+                     bool utc);
   }
 }
--- a/NEWS	Thu Feb 08 11:51:41 2018 +0100
+++ b/NEWS	Mon Feb 19 16:55:05 2018 +0100
@@ -5,6 +5,9 @@
 --------
 
 * "/system" URI returns the version of the Orthanc REST API
+* "/tools/now" returns the current UTC (universal) time
+* "/tools/now-local" returns the curent local time.
+  This was the behavior of "/tools/now" until release 1.3.1.
 * Added "?expand" GET argument to "/peers" and "/modalities" routes
 * New URI: "/tools/create-media-extended" to generate a DICOMDIR
   archive from several resources, including additional type-3 tags
@@ -12,6 +15,7 @@
 Maintenance
 -----------
 
+* Orthanc now uses UTC (universal time) instead of local time in its database
 * Fix to allow creating DICOM instances with empty Specific Character Set (0008,0005)
 * Upgrade to curl 7.57.0 for static and Windows builds
 * Support of Linux Standard Base
--- a/OrthancServer/OrthancRestApi/OrthancRestAnonymizeModify.cpp	Thu Feb 08 11:51:41 2018 +0100
+++ b/OrthancServer/OrthancRestApi/OrthancRestAnonymizeModify.cpp	Mon Feb 19 16:55:05 2018 +0100
@@ -831,7 +831,7 @@
     
     // Inject time-related information
     std::string date, time;
-    SystemToolbox::GetNowDicom(date, time);
+    SystemToolbox::GetNowDicom(date, time, true /* use UTC time (not local time) */);
     dicom.ReplacePlainString(DICOM_TAG_ACQUISITION_DATE, date);
     dicom.ReplacePlainString(DICOM_TAG_ACQUISITION_TIME, time);
     dicom.ReplacePlainString(DICOM_TAG_CONTENT_DATE, date);
--- a/OrthancServer/OrthancRestApi/OrthancRestSystem.cpp	Thu Feb 08 11:51:41 2018 +0100
+++ b/OrthancServer/OrthancRestApi/OrthancRestSystem.cpp	Mon Feb 19 16:55:05 2018 +0100
@@ -131,9 +131,10 @@
     call.GetOutput().AnswerBuffer(result, "text/plain");
   }
 
+  template <bool UTC>
   static void GetNowIsoString(RestApiGetCall& call)
   {
-    call.GetOutput().AnswerBuffer(SystemToolbox::GetNowIsoString(), "text/plain");
+    call.GetOutput().AnswerBuffer(SystemToolbox::GetNowIsoString(UTC), "text/plain");
   }
 
 
@@ -274,7 +275,8 @@
     Register("/statistics", GetStatistics);
     Register("/tools/generate-uid", GenerateUid);
     Register("/tools/execute-script", ExecuteScript);
-    Register("/tools/now", GetNowIsoString);
+    Register("/tools/now", GetNowIsoString<true>);
+    Register("/tools/now-local", GetNowIsoString<false>);
     Register("/tools/dicom-conformance", GetDicomConformanceStatement);
     Register("/tools/default-encoding", GetDefaultEncoding);
     Register("/tools/default-encoding", SetDefaultEncoding);
--- a/OrthancServer/ServerIndex.cpp	Thu Feb 08 11:51:41 2018 +0100
+++ b/OrthancServer/ServerIndex.cpp	Mon Feb 19 16:55:05 2018 +0100
@@ -770,7 +770,7 @@
       }
 
       // Attach the auto-computed metadata for the patient/study/series levels
-      std::string now = SystemToolbox::GetNowIsoString();
+      std::string now = SystemToolbox::GetNowIsoString(true /* use UTC time (not local time) */);
       db_.SetMetadata(series, MetadataType_LastUpdate, now);
       db_.SetMetadata(study, MetadataType_LastUpdate, now);
       db_.SetMetadata(patient, MetadataType_LastUpdate, now);
@@ -1281,7 +1281,7 @@
                               type,
                               publicId,
                               remoteModality,
-                              SystemToolbox::GetNowIsoString(),
+                              SystemToolbox::GetNowIsoString(true /* use UTC time (not local time) */),
                               patientId,
                               studyInstanceUid,
                               seriesInstanceUid,
--- a/OrthancServer/ServerIndexChange.h	Thu Feb 08 11:51:41 2018 +0100
+++ b/OrthancServer/ServerIndexChange.h	Mon Feb 19 16:55:05 2018 +0100
@@ -59,7 +59,7 @@
       changeType_(changeType),
       resourceType_(resourceType),
       publicId_(publicId),
-      date_(SystemToolbox::GetNowIsoString())
+      date_(SystemToolbox::GetNowIsoString(true /* use UTC time (not local time) */))
     {
     }
 
--- a/UnitTestsSources/UnitTestsMain.cpp	Thu Feb 08 11:51:41 2018 +0100
+++ b/UnitTestsSources/UnitTestsMain.cpp	Mon Feb 19 16:55:05 2018 +0100
@@ -908,6 +908,20 @@
 }
 
 
+TEST(Toolbox, Now)
+{
+  LOG(WARNING) << "Local time: " << SystemToolbox::GetNowIsoString(false);
+  LOG(WARNING) << "Universal time: " << SystemToolbox::GetNowIsoString(true);
+
+  std::string date, time;
+  SystemToolbox::GetNowDicom(date, time, false);
+  LOG(WARNING) << "Local DICOM time: [" << date << "] [" << time << "]";
+
+  SystemToolbox::GetNowDicom(date, time, true);
+  LOG(WARNING) << "Universal DICOM time: [" << date << "] [" << time << "]";
+}
+
+
 
 #if ORTHANC_ENABLE_PUGIXML == 1
 TEST(Toolbox, Xml)