From 05d0ffb9d7249e5ea193dfa152553d0f6db7c123 Mon Sep 17 00:00:00 2001 From: ssvine <79405160+ssvine@users.noreply.github.com> Date: Tue, 9 Apr 2024 15:07:43 +0300 Subject: [PATCH 1/3] Fix DateTimeToString --- src/base/Sysutils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/base/Sysutils.cpp b/src/base/Sysutils.cpp index 6995aedbb..fe8762418 100644 --- a/src/base/Sysutils.cpp +++ b/src/base/Sysutils.cpp @@ -1402,7 +1402,7 @@ UnicodeString DateTimeToString(const UnicodeString & Format, return Result; AnsiString Buffer(80, 0); - if (0 != strftime(const_cast(Buffer.data()), sizeof(Buffer), AnsiString(Format).c_str(), &dt)) + if (0 != strftime(const_cast(Buffer.data()), Buffer.GetLength(), AnsiString(Format).c_str(), &dt)) Result = Buffer; return Result; From 8983b4782913175e9c8fda64fe42bf06530b70d6 Mon Sep 17 00:00:00 2001 From: ssvine <79405160+ssvine@users.noreply.github.com> Date: Tue, 9 Apr 2024 20:14:45 +0300 Subject: [PATCH 2/3] Ensure correct locale is used in DateTimeToString --- src/base/Sysutils.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/base/Sysutils.cpp b/src/base/Sysutils.cpp index fe8762418..ac4415db7 100644 --- a/src/base/Sysutils.cpp +++ b/src/base/Sysutils.cpp @@ -1377,6 +1377,15 @@ bool TryStrToDateTime(const UnicodeString & StrValue, TDateTime & Value, UnicodeString DateTimeToString(const UnicodeString & Format, const TDateTime & DateTime) { + auto LocaleDeleter = [](_locale_t *Locale) + { + if (Locale && *Locale) + { + _free_locale(*Locale); + } + }; + static std::unique_ptr<_locale_t, decltype(LocaleDeleter)> CLocale(new _locale_t(_create_locale(LC_TIME, "C")), LocaleDeleter); + UnicodeString Result; // SYSTEMTIME st; // ::ZeroMemory(&st, sizeof(SYSTEMTIME)); @@ -1402,7 +1411,7 @@ UnicodeString DateTimeToString(const UnicodeString & Format, return Result; AnsiString Buffer(80, 0); - if (0 != strftime(const_cast(Buffer.data()), Buffer.GetLength(), AnsiString(Format).c_str(), &dt)) + if (0 != _strftime_l(const_cast(Buffer.data()), Buffer.GetLength(), AnsiString(Format).c_str(), &dt, *CLocale)) Result = Buffer; return Result; From 7c81d24db2e949a67935dcd7569f79e445f3d537 Mon Sep 17 00:00:00 2001 From: ssvine <79405160+ssvine@users.noreply.github.com> Date: Tue, 9 Apr 2024 22:23:42 +0300 Subject: [PATCH 3/3] Fix WebDAV preserve time --- src/core/WebDAVFileSystem.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/core/WebDAVFileSystem.cpp b/src/core/WebDAVFileSystem.cpp index d27453223..85649f28c 100644 --- a/src/core/WebDAVFileSystem.cpp +++ b/src/core/WebDAVFileSystem.cpp @@ -1428,11 +1428,7 @@ void TWebDAVFileSystem::Source( UnicodeString LastModified = FormatDateTime(L"ddd, d mmm yyyy hh:nn:ss 'GMT'", ModificationUTC, FormatSettings); #endif // defined(__BORLANDC__) - uint16_t Y, M, D, H, NN, S, MS; - const TDateTime & DateTime = ModificationUTC; - DateTime.DecodeDate(Y, M, D); - DateTime.DecodeTime(H, NN, S, MS); - const UnicodeString LastModified = FORMAT("%04d, %d %02d %04d %02d:%02d%02d 'GMT'", D, D, M, Y, H, NN, D); + const UnicodeString LastModified = DateTimeToString(L"%a, %#d %b %Y %H:%M:%S GMT", ModificationUTC); const UTF8String NeonLastModified(LastModified); // second element is "NULL-terminating"