Avatar billede AOlsen Juniormester
04. juni 2018 - 22:34 Der er 3 kommentarer og
1 løsning

Hjælp til Datetime

I en CSV fil findes følgende dato "2050-12-31".

Når jeg læser datoen fra min udviklingsmaskine med følgende kode

// public DateTime? EndDate { get; set; }

if (!string.IsNullOrEmpty(splitString[++curCol])) row.EndDate = Convert.ToDateTime(splitString[curCol]);

og bagefter skriver den til Excel med følgende kode
ws.Cells[curRow, ++curCol].Value = endDate.Value.ToShortDateString();

så vises datoen korrekt.

Når datoen læses fra en server, der kører samme kode, så ender værdien 31-12-1950 i Excel arket.

Jeg har forsøgt at skrifte tastatur til EN i stedet for DA på min maskine (nede ved klokken), Men jeg kan ikke frembringe den skæve dato i Excel.

Jeg tænker det må være noget med localisation og dato formatet på serveren? Kan  nogen forklare, hvad der går galt og hvorfor man lige ender på år en dato i år 1950? (Kan se, at Datetime.Minvaulue er 1/1/0001)
Avatar billede Syska Mester
04. juni 2018 - 23:17 #1
Jeg kan ikke forklare det du ser ...

Men du kunne prøve: DateTime.ParseExact("2050-12-31", "yyyy-MM-dd", CultureInfo.InvariantCulture)

Så burde det virke lige meget hvad Culture du har sat ... ( PS. det har intet med dit keyboard at gøre ...

Du kan se hvad Culture du er på:
CultureInfo.CurrentCulture // da-DK
og
CultureInfo.CurrentUICulture // en-US

Jeg kører lidt en blanding :-)
Avatar billede arne_v Ekspert
05. juni 2018 - 03:55 #2
Fejlen kan vist kun opstaa paa en maade.

Et sted bliver der brugt 2 cifret aar d.v.s. 50 og din PC og server har forskellig cutoff date, saa din PC laver 50->2050 mens server laver 50->1950.

Hvis fejlen opstaar fordi der er et 2 cifret aar i CSV filen, saa skal det nok fixes inden parsning. Syska's kode er god fordi den vil give en fejl i dette tilfaelde.

Hvis fejlen opstaar fordi .ToShortDateString giver et 2 cifret aar p.g.a. noget snavs i konfiguration, saa skal den erstattes af en .ToString med et eksplicit format som sikrer altid 4 cifret aar.
Avatar billede AOlsen Juniormester
06. juni 2018 - 13:14 #3
Tak for kommentarer begge 2.

Arne_v:
Tak for uddybningen. Det er super brugbart. Jeg har ikke søgt videre efter den omtalte cutoff date setting, men udfra din forklaring giver det god mening, at det er en 2 cifret håndtering af år på serveren, der påvirker læse-skrive rutinen.

Jeg har implementeret en datetime tilgang a la Syska's forslag.
Avatar billede arne_v Ekspert
06. juni 2018 - 18:26 #4
Et eksempel:


using System;
using System.Globalization;

namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CultureInfo ci = (CultureInfo)CultureInfo.CurrentCulture.Clone();
            string s = "18-06-06";
            DateTime dt1 = DateTime.ParseExact(s, "yy-MM-dd", ci);
            Console.WriteLine(dt1.Year);
            ci.Calendar.TwoDigitYearMax = 2017;
            DateTime dt2 = DateTime.ParseExact(s, "yy-MM-dd", ci);
            Console.WriteLine(dt2.Year);
            Console.ReadKey();
        }
    }
}


skriver:

2018
1918
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester