Maneira padrão de conversão de std :: time_t para System :: DateTime?

Eu já encontrei várias respostas relacionadas à conversão de umstd::time_t valor paraSystem::DateTime e volta. No entanto, quase todas as respostas parecem negligenciar que o tipo destd::time_t é realmente indefinido no padrão. A maioria das soluções lançadasstd::time_t ao que for necessário ou aplique operações aritméticas a umstd::time_t objeto que é possível por ser do tipo aritmético, mas não há especificação sobre o resultado dessa operação. Eu sei dissoa maioria compiladores definemtime_t como umint de algum tamanho, mas apenas o fato de que mudou deint32 paraint64 recentemente, em muitas implementações, mostra que as mudanças são realmente possíveis.

Então, eu vim com esta solução quedevemos trabalhar com qualquer tipo destd::time_t. Funciona do que eu vi. Mas eu estava pensando -Existem possíveis armadilhas que eu desconhecia?

template <>
inline System::DateTime marshal_as(const std::time_t &from_object)
{
    // Returns DateTime in Local time format from time_t (assumed to be UTC)
    const auto unix_epoch = makeUtcTime(1970, 1, 1, 0, 0, 0);
    const auto unix_epoch_dt = System::DateTime(1970, 1, 1, 0, 0, 0, System::DateTimeKind::Utc);
    const auto secondsSinceEpoch = std::difftime(from_object, unix_epoch);
    return const_cast<System::DateTime&>(unix_epoch_dt).AddSeconds(secondsSinceEpoch).ToLocalTime();
} // end of System::DateTime marshal_as(const std::time_t &from_object)

template <>
inline std::time_t marshal_as(const System::DateTime &from_object)
{
    // Returns time_t in UTC format from DateTime
    auto from_dt = const_cast<System::DateTime&>(from_object).ToUniversalTime();
    return makeUtcTime(from_dt.Year, from_dt.Month, from_dt.Day, from_dt.Hour, from_dt.Minute, from_dt.Second);
} // end of std::time_t marshal_as(const System::DateTime &from_object)

Foram feitas três suposições:

Resultantestd::time_t deve estar no UTC, pois não contém nenhuma informação sobre localizaçãoResultanteSystem::DateTime deve ser a hora local desdeSystem::DateTime::Now retorna um localizadoDateTimemakeUtcTime é uma função auxiliar que cria umstd::tm a partir dos valores fornecidos e cria um UTCstd::time_t fora disso. Atualmente, isso é implementado usando_mkgmtime porque nosso código de interoperabilidade pode confiar com segurança na existência de extensões da Microsoft. No entanto, uma versão UTC domktime também está prontamente disponível em outros compiladores (padrãomktime espera horário local).

2 coisas menos importantes a considerar:

oconst_cast é necessário porque o marshal_as-template espera umconst T& como parâmetro e não consigo acessar as propriedades de um objeto de tipo de valor const.NET. No entanto, pode haver uma solução melhor.Ounix_epoch... coisas sejamstatic const?

(Eu não tinha certeza se isso deveria ser publicado no "Programmers Exchange", pois é mais uma discussão, mas uma vez que é uma pergunta C ++ muito específica, achei que o SO poderia ser o melhor lugar para perguntar)

questionAnswers(2)

yourAnswerToTheQuestion