Ik ben nu ongeveer zes jaar een professionele ontwikkelaar. In die zes jaar heb ik nooit voor een bedrijf of aan een project gewerkt dat niet op de een of andere manier worstelde met datum- en tijdkwesties.





Bijna elke applicatie waaraan u werkt, vereist op de een of andere manier tijd, wat betekent dat u op een gegeven moment datums of tijden zult moeten verzamelen, opslaan, ophalen en weergeven. Er is geen wondermiddel voor het omgaan met datums of tijden en je kunt nooit ontsnappen aan de inherente complexiteit van ons concept van tijd, maar er zijn stappen die je kunt nemen om het minder vervelend te maken.



In de jaren dat ik met tijd in verschillende programmeertalen werk, heb ik gemerkt dat de volgende kennis een lange weg gaat.



Het juiste gegevensformaat kiezen

De eerste stap bij het werken met tijden en datums is het kiezen van een weergave voor uw gegevens. Hoewel verschillende formaten min of meer hetzelfde lijken, heeft het formaat dat u kiest een grote invloed op de manier waarop u uw code schrijft en debugt.

Als u een numeriek tijdstempel gebruikt wanneer u een datum nodig heeft, betekent dit dat u het tijdstempel van de datum moet ontleden en de datum daaruit moet ophalen, wat al dan niet eenvoudig kan zijn, afhankelijk van de tijdzone.


44 nummers

Het gebruik van een aangepaste tekenreeks om een ​​tijdspanne weer te geven, lijkt gemakkelijk op te slaan en te manipuleren, maar het is moeilijk te doorzoeken. Bovendien zal het gebruik van elke vorm van representatie die niet onmiddellijk herkenbaar is voor het menselijk oog, het debuggen van uw code moeilijker maken.



Bij het kiezen van een formaat voor datums of tijden, houd ik me aan de volgende regels:



  1. Gebruik nooit numerieke tijdstempels. Ze zijn vaak het gemakkelijkst te verkrijgen door standaardbibliotheken in verschillende programmeertalen, maar ze zijn niet leesbaar voor mensen en de verleiding om ze te manipuleren is te groot.
  2. Zich houden aan ISO 8601 , een standaard die een indeling definieert voor datum- en tijdgerelateerde gegevens. Het is triviaal om voor elke taal een bibliotheek te vinden die de variaties van ISO 8601 aankan.
  3. ISO 8601 is een standaard, maar kent veel variaties. U moet altijd de meest door mensen leesbare variant van ISO 8601 kiezen. Dit vereist geen extra inspanning, maar maakt het debuggen gemakkelijker.
  4. Uw tijdstempeltekenreeks mag alleen gegevens bevatten die u absoluut nodig heeft. Als u met tijden werkt, mag uw string geen datum bevatten en als u met een datum werkt die tijdzone-agnostisch is, mag uw string geen tijdzone bevatten. Het toevoegen van extra informatie voegt dubbelzinnigheid toe aan de ontledingsoperatie en aan de bedoeling van de gegevens voor toekomstige ontwikkelaars
  5. Wanneer u tijdzones opslaat, normaliseert u altijd naar dezelfde tijdzone in uw tijdstempels. Dit maakt het niet alleen gemakkelijker voor een computer om de gegevens te sorteren en te verwerken, maar het maakt het ook gemakkelijker voor een menselijke ontwikkelaar.

Als u zich aan deze regels houdt, kost het u vooraf niet veel, maar ze zullen uw leven gemakkelijker maken wanneer uw aanvraag is ingesteld en u merkt dat uw gebruik van tijden en datums niet is wat u had verwacht.

Het juiste gereedschap kiezen

Zoals met de meeste problemen in onze branche, komt het afhandelen van tijd en datum neer op het kiezen van het juiste gereedschap voor de klus.



Het is verleidelijk om de tools in de standaardbibliotheek van uw favoriete taal te gebruiken, maar dat is misschien niet de beste keuze. Terwijl sommige standaardbibliotheken fantastische datum- en tijdfuncties hebben (Python), zijn andere ronduit zielig (Javascript). Als u de verkeerde tool gebruikt, wordt het veel moeilijker om functies te ontwikkelen op basis van tijd en dat maakt het gemakkelijker voor bugs om in uw applicatie te glippen.



Een goede bibliotheek voor het afhandelen van datums en tijden stelt u in staat de 5 hierboven genoemde regels te volgen. Concreet zou het in staat moeten zijn om:



  • Ontleed elke datumweergave die u mogelijk tegenkomt (inclusief externe representaties).
  • Uitvoer naar elke datumweergave die u nodig heeft (inclusief externe representaties).
  • Manipuleer datums en tijden door er tijdseenheden van toe te voegen of af te trekken.
  • Vergelijk data en tijden.
  • Converteer correct tussen tijdzones.

Het is belangrijk dat uw bibliotheek deze functies ondersteunt, anders is de verleiding om te proberen de functionaliteit zelf te implementeren te groot. En voor de duidelijkheid: als u een van die functies zelf probeert te implementeren, zal het mislukken.

Ontleed uw eigen tijdstempels niet met reguliere expressies, voeg geen seconden toe aan een numeriek tijdstempel omdat het een normaal getal lijkt en vergelijk geen datums en tijden met de gelijkheidsoperator. Deze bibliotheken bestaan ​​omdat deze problemen moeilijk op te lossen zijn en als u het wiel in uw applicatie opnieuw uitvindt, blijft u achter met een kapot wiel.

Hieronder heb ik een paar suggesties voor bibliotheken die aan deze criteria voldoen:

Taal Bibliotheek
Python Standaardbibliotheek
Javascript Moment en Moment tijdzone
Java 8 en hoger Standaardbibliotheek (java.time)
Java 7 en lager Joda-Time
Snel SwiftDate

Als uw taal niet wordt vermeld (omdat ik er niet voldoende bekend mee ben), zoekt u gewoon naar de bibliotheek voor datum en tijd. De kans is groot dat u een goede bibliotheek zult vinden die alles doet wat u nodig heeft.

Weten over tijd

Het laatste stukje kennis dat ik moet delen, is niet specifiek voor het werken met datums en tijden, maar is meer een algemene filosofie om ons te helpen problemen te vermijden en het is evenzeer van toepassing op het omgaan met datum en tijd als bij elk ander probleem bij het programmeren .

Controleer altijd uw aannames.

We benaderen elk probleem dat wordt voorgelegd met een grote hoeveelheid kennis en een nog grotere hoeveelheid aannames. Bij het omgaan met datums en tijden is het belangrijker dan ooit om uw aannames te controleren om er zeker van te zijn dat ze nog steeds gelden voor uw scenario.

Deze lijst , getiteld Falsehoods Programmers Believe About Time, geeft veel uitstekende voorbeelden die illustreren dat tijd waarschijnlijk niet is wat je dacht. Wanneer u een functie ontwerpt of ontwikkelt waarin tijd centraal staat, raad ik u aan om een ​​partner te zoeken en deze lijst door te nemen om ervoor te zorgen dat u de genoemde valkuilen vermijdt.

Tijdbugs zijn notoir moeilijk te vangen en nog moeilijker om op te testen. Als u zich ontwikkelt met deze lijst in gedachten, kunt u mogelijk subtiele bugs vermijden die uw klanten zouden kunnen treffen, maar die ze misschien niet zullen opvangen (de ergste soort bug!)

Tijdzones

Geen enkele discussie over tijden of datums zou compleet zijn zonder vermelding van tijdzones. Maak uzelf niet alleen vertrouwd met de hierboven genoemde veelvoorkomende onwaarheden, maar maak uzelf ook vertrouwd met de basisprincipes van tijdzones.

Tijdzones zullen consequent een pijnpunt zijn bij het werken met de tijd, zelfs als je denkt dat je ze “allemaal bedacht” hebt. Als u een beetje kennis heeft over tijdzones, kunt u uw denken centreren en ervoor zorgen dat u geen logische fouten maakt bij het manipuleren van tijden.

Helaas is er geen manier om de moeilijkheid van het opslaan en manipuleren van tijden en datums bij het programmeren volledig te vermijden. Maar als u deze stappen volgt en met deze kennis in gedachten werkt, kunt u de taak gemakkelijker maken door de hoeveelheid code die u hoeft te schrijven te verminderen en uzelf te dwingen tot paradigma's die minder snel problemen veroorzaken.

Deel Het Met Je Vrienden: