Igniters,

What do you think about changing .NET API to read/write portable dates by
default and making that really portable?

*The Problem*
Presently .NET API writes dates as composite Ignite objects. Only .NET
clients can read such dates: any other client (JDBC, Java, etc) does not
understand it without custom deserialization.

It is still possible to configure .NET serialization to write dates as
Ignite dates - see DateTime Serialization note
<https://ignite.apache.org/docs/latest/net-specific/net-platform-interoperability#types-compatibility>.
But then Ignite accepts only UTC dates, requiring the application
developers to convert local dates to UTC dates and back. This task is not
trivial: DateTime.ToUniversalTime
<https://docs.microsoft.com/en-us/dotnet/api/system.datetime.touniversaltime?view=netcore-3.1>
uses
calendars different from Java (and the .NET calendars are the invalid ones
- especially for pre-1990 dates).

The motivation for the current default behavior was probably the desire to
keep the Time Zone information: Ignite dates do not store time zones.

In our experience interoperability is more important than storing time zone
info.

*The Proposal*

   1. Always write .NET dates as portable Ignite dates: get rid of the
   BinaryReflectiveSerializer.ForceTimestamp flag that currently triggers this
   behavior.
      - We could still keep the ForceTimestamp flag if saving .NET dates as
      transparent objects seems a useful case. We do not think it is useful.
   2. Automatically convert Local dates to UTC and back *inside*
   Ignite.NET.
      - In this case we lose the DateTime.Kind of UTC dates: we write a UTC
      date but we would read a Local date since Ignite would always convert UTC
      to Local when reading.
      We could add a UtcDate date flag to QuerySqlFieldAttribute
      and BinaryReflectiveSerializer to control the deserialization behavior if
      keeping dates in UTC format use case seems important.
   3. Use NodaTime <https://nodatime.org/> for UTC<->Local conversions.
   Noda time uses Java calendars making the conversion truely portable.

*The Benefits*

   1. We think portable dates are much more important than storing time
   zone info. Why do we store time zones for every date on the server anyway?
   Time zone is client-side info.
   2. Simpler application code: no more manual configuration to trigger the
   portable behavior.
   3. Non-trivial code to make the truly portable UTC<->Local conversion is
   implemented once inside Ignite instead of having every Ignite.NET
   application implementing it.

Thank you!

-- 
Best regards,
Alexey

Reply via email to