Fixed a time zone issue related to the Unix epoch.

This commit is contained in:
Leon Styhre 2021-11-26 20:55:54 +01:00
parent a88a6dcd78
commit a4f8fe78e1
6 changed files with 34 additions and 22 deletions

View file

@ -25,7 +25,7 @@ namespace
{"sortname", MD_STRING, "", false, "sortname", "enter sortname", false}, {"sortname", MD_STRING, "", false, "sortname", "enter sortname", false},
{"desc", MD_MULTILINE_STRING, "", false, "description", "enter description", true}, {"desc", MD_MULTILINE_STRING, "", false, "description", "enter description", true},
{"rating", MD_RATING, "0", false, "rating", "enter rating", true}, {"rating", MD_RATING, "0", false, "rating", "enter rating", true},
{"releasedate", MD_DATE, "19700101T010000", false, "release date", "enter release date", true}, {"releasedate", MD_DATE, "19700101T000000", false, "release date", "enter release date", true},
{"developer", MD_STRING, "unknown", false, "developer", "enter developer", true}, {"developer", MD_STRING, "unknown", false, "developer", "enter developer", true},
{"publisher", MD_STRING, "unknown", false, "publisher", "enter publisher", true}, {"publisher", MD_STRING, "unknown", false, "publisher", "enter publisher", true},
{"genre", MD_STRING, "unknown", false, "genre", "enter genre", true}, {"genre", MD_STRING, "unknown", false, "genre", "enter genre", true},
@ -48,7 +48,7 @@ namespace
{"name", MD_STRING, "", false, "name", "enter name", true}, {"name", MD_STRING, "", false, "name", "enter name", true},
{"desc", MD_MULTILINE_STRING, "", false, "description", "enter description", true}, {"desc", MD_MULTILINE_STRING, "", false, "description", "enter description", true},
{"rating", MD_RATING, "0", false, "rating", "enter rating", true}, {"rating", MD_RATING, "0", false, "rating", "enter rating", true},
{"releasedate", MD_DATE, "19700101T010000", false, "release date", "enter release date", true}, {"releasedate", MD_DATE, "19700101T000000", false, "release date", "enter release date", true},
{"developer", MD_STRING, "unknown", false, "developer", "enter developer", true}, {"developer", MD_STRING, "unknown", false, "developer", "enter developer", true},
{"publisher", MD_STRING, "unknown", false, "publisher", "enter publisher", true}, {"publisher", MD_STRING, "unknown", false, "publisher", "enter publisher", true},
{"genre", MD_STRING, "unknown", false, "genre", "enter genre", true}, {"genre", MD_STRING, "unknown", false, "genre", "enter genre", true},

View file

@ -532,7 +532,7 @@ void GuiScraperSearch::updateInfoPane()
} }
// Set the release date to this value to force DateTimeEditComponent to put a // Set the release date to this value to force DateTimeEditComponent to put a
// blank instead of the text 'unknown' prior to the scrape result being returned. // blank instead of the text 'unknown' prior to the scrape result being returned.
mMD_ReleaseDate->setValue("19700101T010101"); mMD_ReleaseDate->setValue("19710101T010101");
mMD_Developer->setText(""); mMD_Developer->setText("");
mMD_Publisher->setText(""); mMD_Publisher->setText("");
mMD_Genre->setText(""); mMD_Genre->setText("");
@ -906,7 +906,7 @@ bool GuiScraperSearch::saveMetadata(const ScraperSearchResult& result,
continue; continue;
// Make sure to set releasedate to the proper default value. // Make sure to set releasedate to the proper default value.
if (key == "releasedate" && metadata.get(key) == "19700101T010000") if (key == "releasedate" && metadata.get(key) == "19700101T000000")
metadata.set(key, mMetaDataDecl.at(i).defaultValue); metadata.set(key, mMetaDataDecl.at(i).defaultValue);
// Overwrite all the other values if the flag to overwrite data has been set. // Overwrite all the other values if the flag to overwrite data has been set.

View file

@ -70,8 +70,8 @@ void DateTimeComponent::onTextChanged()
std::string DateTimeComponent::getDisplayString() const std::string DateTimeComponent::getDisplayString() const
{ {
if (mDisplayRelative) { if (mDisplayRelative) {
// Relative time. // Workaround to handle Unix epoch for different time zones.
if (mTime.getTime() == 0) if (mTime.getTime() < 82800)
return "never"; return "never";
Utils::Time::DateTime now(Utils::Time::now()); Utils::Time::DateTime now(Utils::Time::now());

View file

@ -63,9 +63,9 @@ bool DateTimeEditComponent::input(InputConfig* config, Input input)
// Started editing. // Started editing.
mTimeBeforeEdit = mTime; mTimeBeforeEdit = mTime;
// Initialize to now if unset. // Initialize to the arbitrary value 1999-01-01 if unset.
if (mTime.getTime() == Utils::Time::DEFAULT_TIMEVALUE) { if (mTime == 0) {
mTime = Utils::Time::stringToTime("19990101T0101"); mTime = Utils::Time::stringToTime("19990101T000000");
updateTextCache(); updateTextCache();
} }
} }
@ -307,6 +307,13 @@ void DateTimeEditComponent::changeDate()
{ {
tm new_tm = mTime; tm new_tm = mTime;
if (mTime.getIsoString() == "19700101T000000")
#if defined(_WIN64)
new_tm = {0, 0, 0, 1, 0, 70, 0, 0, -1};
#else
new_tm = {0, 0, 0, 1, 0, 70, 0, 0, -1, 0, 0};
#endif
// ISO 8601 date format. // ISO 8601 date format.
if (mEditIndex == 0) { if (mEditIndex == 0) {
new_tm.tm_year += mKeyRepeatDir; new_tm.tm_year += mKeyRepeatDir;
@ -338,7 +345,10 @@ void DateTimeEditComponent::changeDate()
if (new_tm.tm_mday > days_in_month) if (new_tm.tm_mday > days_in_month)
new_tm.tm_mday = days_in_month; new_tm.tm_mday = days_in_month;
mTime = new_tm; if (mktime(&new_tm) <= 0)
mTime = 0;
else
mTime = new_tm;
updateTextCache(); updateTextCache();
} }
@ -351,7 +361,7 @@ void DateTimeEditComponent::updateTextCache()
// Hack to set date string to blank instead of 'unknown'. // Hack to set date string to blank instead of 'unknown'.
// The calling function simply needs to set this string using setValue(). // The calling function simply needs to set this string using setValue().
if (mTime.getIsoString() == "19700101T010101") { if (mTime.getIsoString() == "19710101T010101") {
dispString = ""; dispString = "";
} }
else { else {

View file

@ -9,8 +9,6 @@
#include "utils/TimeUtil.h" #include "utils/TimeUtil.h"
#include <time.h>
namespace Utils namespace Utils
{ {
namespace Time namespace Time
@ -23,7 +21,7 @@ namespace Utils
#else #else
mTimeStruct = {0, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0}; mTimeStruct = {0, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0};
#endif #endif
mIsoString = "00000000T000000"; mIsoString = "19000101T000000";
} }
DateTime::DateTime(const time_t& time) DateTime::DateTime(const time_t& time)
@ -46,7 +44,12 @@ namespace Utils
void DateTime::setTime(const time_t& time) void DateTime::setTime(const time_t& time)
{ {
mTime = (time < 0) ? 0 : time; // Workaround to handle Unix epoch for different time zones.
if (time < 82800)
mTime = 0;
else
mTime = time;
#if defined(_WIN64) #if defined(_WIN64)
localtime_s(&mTimeStruct, &mTime); localtime_s(&mTimeStruct, &mTime);
#else #else
@ -94,8 +97,8 @@ namespace Utils
#endif #endif
size_t parsedChars = 0; size_t parsedChars = 0;
if (string == "19700101T010000") if (string == "19700101T000000")
return mktime(&timeStruct); return 0;
while (*f && (parsedChars < string.length())) { while (*f && (parsedChars < string.length())) {
if (*f == '%') { if (*f == '%') {
@ -173,6 +176,10 @@ namespace Utils
std::string timeToString(const time_t& time, const std::string& format) std::string timeToString(const time_t& time, const std::string& format)
{ {
// Workaround to handle Unix epoch for different time zones.
if (time < 82800)
return "19700101T000000";
const char* f = format.c_str(); const char* f = format.c_str();
tm timeStruct; tm timeStruct;
#if defined(_WIN64) #if defined(_WIN64)

View file

@ -10,18 +10,13 @@
#ifndef ES_CORE_UTILS_TIME_UTIL_H #ifndef ES_CORE_UTILS_TIME_UTIL_H
#define ES_CORE_UTILS_TIME_UTIL_H #define ES_CORE_UTILS_TIME_UTIL_H
#if defined(__FreeBSD__) || defined(__OpenBSD__)
#include <ctime> #include <ctime>
#endif
#include <string> #include <string>
namespace Utils namespace Utils
{ {
namespace Time namespace Time
{ {
constexpr static int DEFAULT_TIMEVALUE = 0;
class DateTime class DateTime
{ {
public: public: