drupal-datum-tijdzone.md 2.3 KB

Tijdzone-fix voor evenementen/create en stadsactiviteiten/create (Drupal 7, custom.module)

Symptoom (gemeten 2026-09-13, nid 217916): de app stuurt "datum_start":"2026-09-25 20:20:00" (lokale Nederlandse tijd), de site toont 22:20. Drupal leest de string als UTC en rendert in Europe/Amsterdam.

Fix — in custom.evenementen_aanmaken.inc, op de plek waar datum_start (en datum_eind) naar field_date gaat. Interpreteer de binnenkomende string expliciet als Amsterdamse tijd en sla 'm als UTC op (Date-veld met timezone_db = UTC, de gebruikelijke instelling):

/**
 * Zet een lokale (Europe/Amsterdam) datumstring om naar de UTC-string die
 * een Date-veld met timezone_db = 'UTC' verwacht.
 */
function _custom_lokaal_naar_utc($s) {
  $s = trim($s);
  if ($s === '') {
    return '';
  }
  try {
    $d = new DateTime($s, new DateTimeZone('Europe/Amsterdam'));
  }
  catch (Exception $e) {
    return $s; // ongeldig formaat: laat de bestaande validatie het afvangen
  }
  $d->setTimezone(new DateTimeZone('UTC'));
  return $d->format('Y-m-d H:i:s');
}

en dan waar de waarde gezet wordt (naam van de variabelen kan afwijken):

$start = _custom_lokaal_naar_utc($data['datum_start']);
$eind  = !empty($data['datum_eind']) ? _custom_lokaal_naar_utc($data['datum_eind']) : $start;
$node->field_date[LANGUAGE_NONE][0]['value']  = $start;
$node->field_date[LANGUAGE_NONE][0]['value2'] = $eind;
$node->field_date[LANGUAGE_NONE][0]['timezone'] = 'Europe/Amsterdam';
$node->field_date[LANGUAGE_NONE][0]['timezone_db'] = 'UTC';

Controleer eerst hoe het veld is ingesteld: timezone_db van field_date (Structure → Content types → Evenement → field_date → "Time zone handling"). Staat die op "No time zone conversion" / timezone_db = '', dan is de fix juist omgekeerd: dan moet de string ongewijzigd opgeslagen worden en zit de +2u in de weergave (views-datumformat met tijdzone).

Verificatie: één testevenement indienen met 20:20 en in flutterflow_events.json?nid=<nid> moet datum op 20:20 uitkomen. Dezelfde route geldt voor stadsactiviteiten/create (zelfde helper hergebruiken).

Aan de app-kant is niets nodig — die stuurt bewust lokale tijd; als je hier UTC gaat verwachten, moet datumVoorApi/de Date-Format-binding in de app mee.