Ga naar inhoud
  • 0

Zomer/wintertijdcorrectie berekenen in een ics-bestand


marspan

Vraag

Vaak komen er afspraakuitnodigingen mee met een email, in de vorm van een ics-bestand. Daarin staan alle gegevens van de afspraak in iCal-formaat (RFC 5545). De bedoeling is nu om van zo'n afspraakuitnodiging een FileMaker-afspraak te maken. Ik ben bezig custom functions te ontwikkelen om de gegevens uit zo'n ics-bestand te halen. Dat gaat heel aardig, maar nog niet altijd goed. Vervelend is dat het iCal-format erg veel vrijheid biedt, zodat je er nooit zeker van bent hoe bepaalde zaken vermeld worden in een ics-bestand, omdat elke agenda (Outlook, Google, iCal en noem maar op) zaken anders weergeeft. Maar met wat moeite kom ik daar wel uit.

 

Of weet iemand een kant en klare oplossing: plug-in / javascript / custom functions?

 

Er is één belangrijk probleem waar ik niet goed raad mee weet: zomer/wintertijd-correctie. Afspraken worden (gelukkig) meestal weergegeven in UTC-tijd, bijvoorbeeld:

DTSTART:19970903T163000Z

DTEND:19970903T190000Z

is een afspraak op 3 september 1997 van 16:30 tot 19:00 in UTC-tijd (de Z aan het eind).

 

Het uur-aantal berekenen waarmee een tijd moet worden gecorrigeerd voor DIT moment kan met de formule:

hour( Get ( CurrentTimeStamp ) - GetAsTimestamp ( Floor ( Get ( CurrentTimeUTCMilliseconds ) / 1000 ) ))

(Berekening van: BowdenData 1-aug-2014 op https://community.filemaker.com/thread/77489)

 

Maar dat is voor NU. Hoe doe je dat voor een willekeurige datum in de toekomst (en dan dus ook in het verleden)?

Of moet je een tabel gebruiken van de datums waarop zomer- en wintertijd in gaan?

Link naar reactie

5 antwoorden op deze vraag

Aanbevolen berichten

  • 0

Gaat het om alleen de lokale tijd voor onze tijdzone? Dan kun je misschien wat door te kijken of de datum valt tussen laatste zondag van maart en de laatste zondag van oktober. Dit is de zomertijd voor de hele Europese unie. Wil je het ook over verschillende tijdzones berekenen dan is daarvoor b.v. een api op https://www.timeanddate.com/services/api/. Of misschien heb je wat aan dit tabelletje: http://earthsky.org/astronomy-essentials/universal-time

Link naar reactie
  • 0

Ik gebruik de volgende CF bij een klant van me, de commentaren in de formule geven denk ik voldoende duidelijkheid:

// LET OP! Berekening gaat uit van aangeleverde tijd als UTC; UTC ≠ GMT, want GMT wordt voor DST gecorrigeerd. 
// Formule berekent de juiste DST-correctie adhv de laatste zondagen van maart en october.
// De omschakeling van en naar DST gebeurt in UTC altijd op hetzelfde moment van de nacht, na TZ-correctie is er wél een uur verschil!

Let ( [ 
utc = TimeStamp ( 
	Date ( Middle ( ZT ; 5 ; 2 ) ; Middle ( ZT ; 7 ; 2 ) ; Left ( ZT ; 4 ) ) ; 
	Time ( Middle ( ZT ; 10 ; 2 ) ; Middle ( ZT ; 12 ; 2 ) ; Middle ( ZT ; 14 ; 2 ) ) ) ; // Omgerekende ZULU-tijd naar fm-tijdstempelweergave
y = Year ( utc ) ; 
ds = Date ( 4 ; 0 ; y ) ; // Laatste dag Maart
de = Date ( 11 ; 0 ; y ) ; // Laatste dag October
tz = 1 ; // GMT-TimeZone-correctie voor Nederland 
dst0 = Timestamp ( ds - ( DayOfWeek ( ds ) - 1 ) ; Time ( tz ; 0 ; 0 ) ) ; 
dst1 = Timestamp ( de - ( DayOfWeek ( de ) - 1 ) ; Time ( tz ; 0 ; 0 ) ) 
] ; 
 utc + If ( utc ≥ dst0 and utc < dst1 ; 3600 ) + tz * 3600
)

Resultaat is eveneens een tijdstempel

 

[edit=20170209T165500.000Z]

Overtikken is een kunst, Martin wees me op een foutje in de berekening van dst0 en dst1. "dx - DayOfWeek ( dx - 1 )" moet natuurlijk zijn "dx - ( DayOfWeek ( dx ) - 1 )" anders wordt wanneer de laatste dag van de maand een zondag is, een hele week lang de tijd verkeerd omgerekend. De formule die je nu hierboven ziet is de correcte.

[/edit]

aangepast door Gast
Link naar reactie

Doe mee aan dit gesprek

Je kunt dit nu plaatsen en later registreren. Indien je reeds een account hebt, log dan nu in om het bericht te plaatsen met je account.

Gast
Beantwoord deze vraag...

×   Geplakt als verrijkte tekst.   Plak in plaats daarvan als platte tekst

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

×
×
  • Nieuwe aanmaken...