Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

c# datetime utc string and the z when using in javascript

Tags:

javascript

c#

I am getting a date from my api and the format i get is "2019-04-17T15:04:28" the date is UTC. Should the date i get back have the Z at the end or doesn't it matter. Javascript date function will display incorrect if the Z is not there wont it?

Thanks @Esko thanks i think for me the confusion is that in .net core if you change the json serializer options in startup.cs by the following:

AddJsonOptions(opt =>{ 
  opt.SerializerSettings.DateFormatHandling = Newtonsoft.Json.DateFormatHandling.IsoDateFormat;
            });

the tool tip in visual studio says enter image description here yet it doesn't put the Z on and the documentation also doesn't show the Z (https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_DateFormatHandling.htm)

Instead i am going to try and set a different option

opt.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc;
like image 332
JimmyShoe Avatar asked Nov 17 '22 11:11

JimmyShoe


2 Answers

If you know the timezone to be constant, you can always just append +0Z00 to your datestring. For example, if the server serializes time into CEST, turn "2019-04-17T15:04:28" into "2019-04-17T15:04:28+0100"

Parsing "2019-04-17T15:04:28" in new Date will parse it as if it's in your local timezone - the meaning of this string depends on what timezone it's parsed in.

Parsing "2019-04-17T15:04:28Z" will parse it in GMT - meaning that no matter what system parses it, it will always refer to the same time.

In other words, "2019-04-17T15:04:28" as a timestamp is ambiguous unless you know the timezone it was recorded in.

like image 194
Ferenc Avatar answered Feb 11 '23 08:02

Ferenc


I had the similar problem and I found the answer
In my case the DateTime was with Kind Unspecified, in this case the JsonConvert hasn't enough information to add the Z in the end.

You have several options:

  1. Convert it to UTC with ToUniversalTime method

  2. If you're sure you're working with UTC you can add it to general JsonOptions like this:

     JsonConvert.DefaultSettings = (() =>
             {
                 return new JsonSerializerSettings
                 {
    
                     Converters = new List<JsonConverter>() {new IsoDateTimeConverter { DateTimeStyles= System.Globalization.DateTimeStyles.AssumeUniversal } }
                 };
             });
    
  3. if you just want to add the Kind=UTC to current Unspecified Date, you can always write isoConverter like this:

     JsonSerializerSettings
              {
    
                  Converters = new List<JsonConverter>() {  new CustomIsoDateTimeConverter() }
              };
    

Where the class will look like this:

 public class CustomIsoDateTimeConverter : IsoDateTimeConverter
    {
        public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
        {
            if (value is DateTime dateTime && dateTime.Kind == DateTimeKind.Unspecified)
                value = DateTime.SpecifyKind(dateTime, DateTimeKind.Utc);


            base.WriteJson(writer, value, serializer);
        }
    }
like image 26
cheziHoyzer Avatar answered Feb 11 '23 06:02

cheziHoyzer