/
dev-npgsql
/
npgsql
Обзор
Документация
Войти
/
dev-npgsql
/
npgsql
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
test-logs
src/Npgsql/Internal/Converters/Temporal/PgTimestamp.cs
43 строки
2 KB
Nino Floris
Handler rework (#5123)
26 сен 2023, 00:08
Не верифицирован
26 сен 2023, 00:08
0b7aecb
Код
Авторство
О чём код?
using System; namespace Npgsql.Internal.Converters; static class PgTimestamp { const long PostgresTimestampOffsetTicks = 630822816000000000L; internal static long Encode(DateTime value, bool dateTimeInfinityConversions) { if (dateTimeInfinityConversions) { if (value.Ticks == DateTime.MaxValue.Ticks) return long.MaxValue; if (value.Ticks == DateTime.MinValue.Ticks) return long.MinValue; } // Rounding here would cause problems because we would round up DateTime.MaxValue // which would make it impossible to retrieve it back from the database, so we just drop the additional precision return (value.Ticks - PostgresTimestampOffsetTicks) / 10; } internal static DateTime Decode(long value, DateTimeKind kind, bool dateTimeInfinityConversions) { try { return value switch { long.MaxValue => dateTimeInfinityConversions ? DateTime.MaxValue : throw new InvalidCastException("Cannot read infinity value since DisableDateTimeInfinityConversions is true."), long.MinValue => dateTimeInfinityConversions ? DateTime.MinValue : throw new InvalidCastException("Cannot read infinity value since DisableDateTimeInfinityConversions is true."), _ => new(value * 10 + PostgresTimestampOffsetTicks, kind) }; } catch (ArgumentOutOfRangeException e) { throw new InvalidCastException("Out of range of DateTime (year must be between 1 and 9999).", e); } } }