Avatar billede travelnow Nybegynder
22. oktober 2009 - 09:52 Der er 10 kommentarer og
1 løsning

Rejstid og sommertid

Er nogen der har en ide til flg.
Jeg skal kunne beregne hvor lang tid det f.eks. tager at flyve fra København til Bangkok, det med tidszoner har jeg styr på, men det er straks værre med sommertiden. Findes der en .net klasse der kan håndtere det?, eller en anden løsning? (jeg har brugt timer på at søge på nettet uden den store held)
Avatar billede arne_v Ekspert
22. oktober 2009 - 21:41 #1
Eksempel:

using System;

namespace E
{
    public class Program
    {
        public static TimeSpan TimeDiff(string t1, string tz1, string t2, string tz2)
        {
            TimeZoneInfo tzi1 = TimeZoneInfo.FindSystemTimeZoneById(tz1);
            TimeZoneInfo tzi2 = TimeZoneInfo.FindSystemTimeZoneById(tz2);
            DateTime dt1 = TimeZoneInfo.ConvertTimeToUtc(DateTime.Parse(t1), tzi1);
            DateTime dt2 = TimeZoneInfo.ConvertTimeToUtc(DateTime.Parse(t2), tzi2);
            return dt2 - dt1;
        }
        public static void Main(string[] args)
        {
            Console.WriteLine(TimeDiff("22-Oct-2009 20:30:00", "Eastern Standard Time", "23-Oct-2009 12:00:00", "Central Europe Standard Time"));
            Console.WriteLine(TimeDiff("29-Oct-2009 20:30:00", "Eastern Standard Time", "30-Oct-2009 12:00:00", "Central Europe Standard Time"));
            Console.ReadKey();
        }
    }
}
Avatar billede arne_v Ekspert
22. oktober 2009 - 21:42 #2
Min XP SP3 med .NET 3.5 SP1 har iøvrigt fejl i tider for skift til og fra sommer tid, men koden er god nok.
Avatar billede travelnow Nybegynder
23. oktober 2009 - 08:58 #3
Glemte at nævne at det er framework 2.0 (har ikke mulighed for at bruge 3.5, da vi ikke har opgraderet endnu (og der er heller ingen planer om det))

Men kan man kalde et projekt (Dll) fra 2.0 som er lavet i 3.5?
Hvis ja, så kan jeg nok finde en der har 3.5
Avatar billede arne_v Ekspert
23. oktober 2009 - 15:53 #4
Der er ikke tids zone support i .NET 2.0.

Du kunne prøve om du kan kopiere en System.Core.dll over på dit 2.0 system og bruge den der.

Men det er ikke nogen pæn løsning.

Men der er andre muligheder også med 2.0 - lad mig prøve og bixe noget kode.
Avatar billede arne_v Ekspert
24. oktober 2009 - 03:12 #5
Et muligt approach er at udnytte at J# har hele Java 1.1 library.

Kode:

using System;

namespace E
{
    public class Program
    {
        public static TimeSpan TimeDiff(string t1, string tz1, string t2, string tz2)
        {
            java.util.TimeZone tzi1 = java.util.TimeZone.getTimeZone(tz1);
            java.util.TimeZone tzi2 = java.util.TimeZone.getTimeZone(tz2);
            DateTime dt1 = DateTime.Parse(t1);
            dt1 = dt1.AddMilliseconds(-tzi1.getOffset(1, dt1.Year, dt1.Month - 1, dt1.Day, (int)dt1.DayOfWeek, 0));
            DateTime dt2 = DateTime.Parse(t2);
            dt2 = dt2.AddMilliseconds(-tzi2.getOffset(1, dt2.Year, dt2.Month - 1, dt2.Day, (int)dt2.DayOfWeek, 0));
            return dt2 - dt1;
        }
        public static void Main(string[] args)
        {
            Console.WriteLine(TimeDiff("22-Oct-2009 20:30:00", "EST", "23-Oct-2009 12:00:00", "ECT"));
            Console.WriteLine(TimeDiff("29-Oct-2009 20:30:00", "EST", "30-Oct-2009 12:00:00", "ECT"));
            Console.ReadKey();
        }
    }
}
Avatar billede travelnow Nybegynder
30. oktober 2009 - 12:21 #6
Ja det ser umiddelbar ud til at virke, men er der ikke en fejl i dit eksempel, hvorfor står der dt1/dt2.month-1, ser ud til at det virker bedre med hensyn til sommertid hvis det er uden -1?

Noget andet er kender du sammenhængen mellem GMT+1,+2, -1,-2,osv. og så de der 3 bogstavs forkortelser, kan se at der er 32 forskellige, men så vidt jeg ved findes der da kun 25 tidszoner -12 til +12, eller sagt på en anden måde kender du et sted hvor man kan se hvad de enkelte svarer til i GMT (så jeg kan omregne til GMT)
Avatar billede arne_v Ekspert
30. oktober 2009 - 18:14 #7
En eller anden havde en hjernebloedning da han designede Java's dato API. Maaneder er 0-11 i Java ! Derfor tror jeg at de -1 er korrekte.
Avatar billede arne_v Ekspert
30. oktober 2009 - 18:23 #8
Man kan hente alle tidszoner.

Jeg laver et eksempel senere.
Avatar billede arne_v Ekspert
31. oktober 2009 - 01:38 #9
using System;

namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
            foreach(string id in java.util.TimeZone.getAvailableIDs())
            {
                java.util.TimeZone tz = java.util.TimeZone.getTimeZone(id);
                Console.WriteLine("{0} {1:F2}", id, tz.getRawOffset()/3600000.0);
            }
            Console.ReadKey();
        }
    }
}
Avatar billede arne_v Ekspert
22. november 2009 - 04:19 #10
OK ?
Avatar billede travelnow Nybegynder
23. november 2009 - 09:04 #11
Det ser ud til at virke, det er dog ikke helt gennemtestet endnu mht. sommertid, men de stikprøver jeg har lavet virker, så tak for hjælpen.
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
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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