Poco::LocalDateTime::timestamp() не конвертирует метки времени в UTC

Согласно заголовочному файлу Poco::Timestamp временные метки указаны в формате UTC, см. документацию по временным меткам. Если временные метки указаны в формате UTC, не должен ли метод, преобразующий Poco::LocalDateTime в Poco::Timestamp, убедиться, что возвращаемая временная метка находится в формате UTC? В настоящее время Poco::LocalDateTime::timestamp() этого не делает, и временная метка возвращается по местному времени.

Это особенно странно, поскольку оператор присваивания Poco::LocalDateTime::operator = (const Timestamp& timestamp) выполняет преобразование времени UTC в местное. Следующий код утверждает из-за этого:

Poco::LocalDateTime local1 = Poco::LocalDateTime( 2020, 1, 30 );
Poco::Timestamp timestamp = local1.timestamp();
Poco::LocalDateTime local2 = timestamp;
assert( local1 == local2 );

local1 не будет иметь того же значения, что и local2 в этом примере. Мне одному кажется, что это странное поведение?


person Martin Arvidssson    schedule 30.01.2020    source источник
comment
Обходной путь: Poco::Timestamp timestampFromLocalTime = Poco::Timestamp::fromUtcTime( Poco::LocalDateTime( 1970, 1, 1 ).utcTime() );   -  person Martin Arvidssson    schedule 30.01.2020
comment
Если вы посмотрите на LocalDateTime::timestamp(), вы увидите, что он преобразует метку времени перед возвратом через Timestamp::fromUtcTime, так что эта функция возвращает метку времени в местном времени, а не во времени UTC.   -  person Cookie Butter    schedule 13.03.2020
comment
Вы можете использовать функцию Timestamp::utcTime() или функцию Timestamp::raw(), но они возвращают разные типы, чтобы вы случайно не сделали что-то не так. Чего вы на самом деле пытаетесь достичь здесь?   -  person Cookie Butter    schedule 13.03.2020
comment
@cookie-butter, Вы говорите: эта функция возвращает отметку времени в местном времени. В документации сказано: Временные метки указаны в формате UTC. Это моя точка зрения.   -  person Martin Arvidssson    schedule 20.05.2020
comment
Да, теперь я понимаю, что вы имеете в виду. Я думаю, что это связано с функцией defineTzd. Когда LocalDateTime создается из метки времени, он определяет _tzd из ОС. Эта дельта может немного отличаться для двух объектов LocalDateTime. Возможно, вам потребуется допуск к проверке на равенство.   -  person Cookie Butter    schedule 21.05.2020


Ответы (1)


Если вы посмотрите на LocalDateTime::timestamp(), вы увидите, что он преобразует метку времени перед возвратом через Timestamp::fromUtcTime, так что эта функция возвращает метку времени в местном времени, а не во времени UTC.

Вы можете использовать функцию Timestamp::utcTime() или функцию Timestamp::raw(), но они возвращают разные типы, чтобы вы случайно не сделали что-то не так.

Чего вы на самом деле пытаетесь достичь здесь?

person Cookie Butter    schedule 19.03.2020
comment
Пользователь выбирает время (по местному времени) в пользовательском интерфейсе. Это время необходимо преобразовать в отметку времени UTC и сохранить в базе данных. Мой вопрос не в том, как выполнить преобразование, а в поведении Poco .timestamp() по отношению к тому, что указано в документации. - person Martin Arvidssson; 20.05.2020
comment
Извините, если я неправильно понял. Вы можете использовать LocalDateTime::utc() или LocalDateTime::utcTime(), чтобы получить время utc для LocalDateTime. - person Cookie Butter; 21.05.2020