Variabelen met datums en tijdstippen

Met Smarty kun je gemakkelijk werken met datums en tijdstippen, dankzij handige ingebouwde variabelen, functies en modifiers. Deze tools kun je gebruiken in e-mailtemplates om profielgegevens weer te geven, of in opvolgacties om te bepalen wanneer een actie uitgevoerd moet worden.

Verschillende vormen van tijdstip-variabelen

Een tijdstip in Smarty kan in drie verschillende vormen voorkomen: als string, als numeriek timestamp of als object. Als je een variabele hebt waarin een datum of tijdstip staat, is het dus op één van de volgende manier opgeslagen:

  • String: een datum/tijdstip als leesbare tekst, bijvoorbeeld "2025-10-04 15:35:00".
  • Numeriek (UNIX timestamp): een getal dat het aantal seconden sinds 1 januari 1970 (UTC) voorstelt, bijvoorbeeld 1764939300.
  • Object: een speciaal datum-object waarbij je losse onderdelen kunt opvragen, zoals .time of .timestamp.

De string-representatie is handig om direct weer te geven, maar is minder geschikt voor berekeningen. Datumvelden vanuit profielen en subprofielen, zoals {$profile.geboortedatum}, worden meestal in dit string-formaat opgeslagen. Timestamps zijn veel handiger voor berekeningen en vergelijkingen. De {$smarty.now} variabele bevat de huidige tijd, en is in dit formaat opgeslagen.

{$profile.geboortedatum}      # variabele in stringvorm, zoals 2001-03-22
{$smarty.now}                 # variabele in timestamp-formaat, 1805719451

Datum-objecten

Soms worden datums of tijdstippen als object opgeslagen. Je kunt het dan zowel als string gebruiken, maar ook de individuele eigenschappen opvragen. Deze objecten vind je bijvoorbeeld bij tijdstippen afkomstig vanuit sommige integraties, of als je de date_mod of datetime modifier gebruikt.

{$event.created_at}            # geeft de stringvorm, zoals 2027-03-22 13:44:11
{$event.created_at.time}       # alleen de tijd: 13:44:11
{$event.created_at.timestamp}  # de UNIX timestamp: 1805719451
{$event.created_at.year}       # 2027
{$event.created_at.month}      # 03
{$event.created_at.day}        # 22

Een datumobject bevat onder andere de volgende eigenschappen:

Eigenschap Omschrijving Voorbeelduitkomst
date Datum in YYYY-MM-DD-formaat 2025-10-09
time Tijd in HH:MM:SS-formaat 10:00:00
year Jaar 2025
month Maand (met voorloopnul) 10
week Weeknummer van het jaar 41
weekday Weekdag als getal (1=maandag, 7=zondag) 4
day Dag van de maand 09
hour Uur van de dag 10
minute Minuut van het uur 00
second Seconde van de minuut 00
monthname Naam van de maand oktober
weekdayname Naam van de weekdag donderdag
timezone Tijdzone van de datum Europe/Amsterdam
offset Tijdzone-afwijking t.o.v. UTC +02:00

Data in een andere taal tonen

De eigenschappen monthname en weekdayname worden automatisch weergegeven in de taal die is ingesteld voor de template of het document. Staat de taal van je template bijvoorbeeld op Nederlandse, dan worden deze waarden weergegeven als "oktober" en "donderdag". Bij een Engels template zijn dat "October" en "Thursday".

Converteren van datums

Het kan soms lastig zijn dat tijdstippen in verschillende formaten kunnen zijn opgeslagen. Maar gelukkig kun je ze heel makkelijk van het ene formaat naar het andere formaat omzetten. Als je niet zeker weet in welk formaat je variabele is opgeslagen, of als je een bepaald formaat wilt afdwingen, kun je de modifiers datetime of timestamp gebruiken: die zetten een datum- of tijdstip-variabele, ongeacht het input-type, direct om naar een object of een timestamp.

- {$profile.geboortedatum|timestamp}    # tijdstip omgezet naar een timestamp
- {$profile.geboortedatum|datetime}     # tijdstip omgezet naar een datetime-object

Deze twee modifiers zijn heel krachtig en kunnen allerlei soorten datumnotaties herkennen, ook bijvoorbeeld strings als "tomorrow" of "next monday". Je kunt hier heel creatief mee zijn. Onder de motorkap wordt een PHP-functie aangeroepen die de conversie verzorgt en die al deze formaten herkent.

{"tomorrow 09:00"|timestamp}
{"next monday 11:30"|timestamp}
{"last day of next month"|timestamp}

Je kunt dit gebruiken voor allerlei handige vergelijkingen:

{if $profile.besteldatum|timestamp >= "7 days ago midnight"|timestamp and $profile.besteldatum < "6 days ago midnight"|timestamp}
    Je hebt vorige week iets besteld
{/if}

Het datum-object slim inzetten

Door slim verschillende modifiers achter elkaar te plaatsen kun je makkelijk datums converteren naar een datum-object, en vervolgens daar de eigenschappen van opvragen:

{$profile.geboortedatum|datetime|get:year}
{$profile.geboortedatum|datetime|get:day}

Hiermee converteer je achtereenvolgens de geboortedatum (die is opgeslagen als een string) naar een object, en daarna lees je van dat object het jaar of de dag uit.

Datums weergeven met date_format

Een alternatieve manier om datums weer te geven is met behulp van date_format Smarty modifier. Aan deze modifier geef je met placeholders aan in welke vorm een datum moet worden weergegeven. Deze modifier is standaard in Smarty aanwezig en ondersteunt veel verschillende opties. De volgende gebruik je het meest:

Optie Omschrijving
%Y jaar als een decimaal getal inclusief de eeuw
%y jaar als een decimaal getal zonder een eeuw (00 tot 99)
%m maand als een decimaal getal (01 tot 12)
%d dag van de maand als decimaal getal (01 tot 31)
%H uur van de dag als decimaal getal (00 tot 23)
%M minuut als decimaal getal (00 tot 59)
%S seconde als decimaal getal (00 tot 59)
%s tijdstip als unix-timestamp

Hieronder volgen enkele voorbeelden:

{$timestamp|date_format:"%Y-%m-%d"}                 # 2020-01-18
{$timestamp|date_format:"%Y-%m-%d %H:%M:%S"}        # 2020-01-18 17:01:44
{$timestamp|date_format:"%d-%m-%y"}                 # 18-01-20
{$timestamp|date_format:"%d-%m-%Y"}                 # 18-01-2020
{$timestamp|date_format:"%d-%m-%Y %H:%M:%S"}        # 18-01-2020 17:01:44

Ook de date_format modifier is krachtig en kan veel verschillende input-types herkennen. Je kunt dus ook allerlei andere inputs gebruiken:

{"tomorrow 09:00"|date_format:"%Y-%m-%d %H:%M:%S"}
{"next monday 11:30"|date_format:"%Y-%m-%d %H:%M:%S"}
{"last day of next month"|date_format:"%Y-%m-%d %H:%M:%S"}

Je kunt de date_format modifier gebruiken in vergelijkingen. Als je een tijdstip bijvoorbeeld formateert als een dag+maand, en het jaar negeert, dan kun je dat gebruiken om te checken of iemand vandaag jarig is:

{if $profile.geboortedatum|date_format:"%m-%d" == $smarty.now|date_format:"%m-%d"}
    Het is je verjaardag
{/if}

De huidige tijd

De huidige tijd is altijd opgeslagen in de variabele {$smarty.now}. Ook kun je de huidige tijd opvragen met de time() functie. Echter, in mailings en opvolgacties wil je soms werken met het verzendtijdstip of het tijdstip waarop de opvolgactie werd gestart. Deze tijdstippen kunnen afwijken van de huidige tijd, bijvoorbeeld als iemand pas een paar dagen later de webversie bekijkt, of als er een wachttijd in de opvolgactie zit. Ook als je een opvolgactie met terugwerkende kracht uitvoert op een logfile, is het tijdstip van de gebeurtenis vaak relevanter dan de huidige tijd.

{$smarty.now}       # altijd de huidige tijd
{time()}            # ook de huidige tijd
{$timestamp}        # de tijdstip van de mailing (in mailings) of het event (in opvolgacties)
{$event.timestamp}  # tijdstip van de gebeurtenis (in opvolgacties)

Profielgegevens gebruiken

Je kunt ook gegevens uit een profiel gebruiken in Smarty-templates. Dit doe je simpelweg door gebruik te maken van dezelfde variabelen die je ergens anders in Smarty al gebruikt, lees er hier meer over. Om bijvoorbeeld de kolom "Geboortedatum" van een profiel in Smarty te gebruiken, schrijf je dus iets als:

{$profile.Geboortedatum}      # 01-01-2000

Tijd optellen

Als je een tijd wilt toevoegen of afhalen van een datum in je database, kun je de date_mod Smarty-modifier gebruiken. Deze modifier kun je gebruiken op een tijdstip in elk mogelijk formaat (string, timestamp of object), past dit tijdstip aan, en zet het om naar een object. Dit gebruik je bijvoorbeeld zo:

{$fieldname|date_mod:"3 days"}

In dit voorbeeld wordt er 3 dagen bij de datum in het veld {$fieldname} opgeteld. In plaats van "days" kun je ook andere tijdseenheden gebruiken, zoals:

  • years (jaren)
  • months (maanden)
  • hours (uren)
  • minutes (minuten)
  • seconds (seconden)

Je kunt ook een negatief getal gebruiken om tijd af te trekken. Bijvoorbeeld, om 3 dagen af te trekken, schrijf je:

{$fieldname|date_mod:"-3 days"}

Het is zelfs mogelijk om verschillende tijdsaanduidingen te combineren. Bijvoorbeeld, als je 3 dagen wilt afhalen, 2 uur wilt optellen en 5 minuten wilt aftrekken, schrijf je:

{$fieldname|date_mod:"-3 days + 2 hours - 5 minutes"}

Daarnaast kun je deze bewerkingen combineren met andere modifiers. Bijvoorbeeld, als je de gemodificeerde datum wilt weergeven in een bepaald formaat, kun je de date_format Smarty-modifier gebruiken:

{$fieldname|date_mod:"3 days"|datetime|get:date}

In dit geval wordt 3 dagen bij de datum opgeteld en vervolgens geformatteerd naar het jaar-maand-dag formaat (%Y-%m-%d).

Tijd optellen bij huidige datum

In plaats van een vaste datum kun je ook het huidige tijdstip gebruiken met {$smarty.now}. Je kunt er vervolgens tijd bij of af tellen met de date_mod-modifier:

{$smarty.now|date_mod:"2 hours"|datetime|get:time}
{$smarty.now|date_mod:"-7 days"|datetime|get:date}