timezone = this.timezoneService.getTimezone(significantPlace);
+ if (timezone.isPresent()) {
+ significantPlace = significantPlace.withTimezone(timezone.get());
+ }
significantPlace = this.significantPlaceJdbcService.create(user, significantPlace);
publishSignificantPlaceCreatedEvent(significantPlace);
return significantPlace;
diff --git a/src/main/resources/db/migration/V40__add_local_timezone_column.sql b/src/main/resources/db/migration/V40__add_local_timezone_column.sql
new file mode 100644
index 00000000..44d48ba3
--- /dev/null
+++ b/src/main/resources/db/migration/V40__add_local_timezone_column.sql
@@ -0,0 +1 @@
+ALTER TABLE significant_places ADD COLUMN timezone TEXT NULL;
\ No newline at end of file
diff --git a/src/main/resources/db/migration/V41__extend_user_settings.sql b/src/main/resources/db/migration/V41__extend_user_settings.sql
new file mode 100644
index 00000000..248f79ea
--- /dev/null
+++ b/src/main/resources/db/migration/V41__extend_user_settings.sql
@@ -0,0 +1,3 @@
+ALTER TABLE user_settings
+ ADD COLUMN time_zone_override TEXT NULL,
+ ADD COLUMN time_display_mode VARCHAR(255) NOT NULL DEFAULT 'DEFAULT'
\ No newline at end of file
diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties
index ddb520fb..f6eda30b 100644
--- a/src/main/resources/messages.properties
+++ b/src/main/resources/messages.properties
@@ -103,6 +103,20 @@ users.oidc.managed.message=This user is managed by an external OIDC provider. Se
users.oidc.view.profile=View external profile
users.avatar.oidc.managed=Avatar is managed by your OIDC provider and will be updated automatically.
+time.title=Time
+time.display.mode.label=Time Display Mode
+time.display.mode.default=Default
+time.display.mode.geo.local=Geo Local
+time.display.mode.description=Choose how times are displayed throughout the application.
+time.display.mode.default.description=Default: All times are displayed in your timezone (from browser or timezone override below)
+time.display.mode.geo.local.description=Geo Local: All times are displayed in the timezone where the location is
+time.timezone.override.label=Timezone Override
+time.timezone.override.none=Use browser timezone
+time.timezone.override.description=Override your timezone instead of using the browser's detected timezone. This affects how times are displayed when using Default mode.
+
+timeline.time.your=Your time
+timeline.time.local=Local time
+
form.remove=Remove
users.home.location.label=Home Location
diff --git a/src/main/resources/messages_de.properties b/src/main/resources/messages_de.properties
index 34390c86..fe231fdd 100644
--- a/src/main/resources/messages_de.properties
+++ b/src/main/resources/messages_de.properties
@@ -110,6 +110,19 @@ users.home.longitude.placeholder=L\u00E4ngengrad eingeben (-180 bis 180)
users.home.location.clear=L\u00F6schen
+time.title=Zeit
+time.display.mode.label=Zeitanzeige-Modus
+time.display.mode.default=Standard
+time.display.mode.geo.local=Geo-Lokal
+time.display.mode.description=W\u00E4hlen Sie, wie Zeiten in der Anwendung angezeigt werden.
+time.display.mode.default.description=Standard: Alle Zeiten werden in Ihrer Zeitzone angezeigt (vom Browser oder der Zeitzone-\u00DCberschreibung unten)
+time.display.mode.geo.local.description=Geo-Lokal: Alle Zeiten werden in der Zeitzone angezeigt, in der sich der Ort befindet
+time.timezone.override.label=Zeitzone \u00FCberschreiben
+time.timezone.override.none=Browser-Zeitzone verwenden
+time.timezone.override.description=\u00DCberschreiben Sie Ihre Zeitzone anstatt die vom Browser erkannte Zeitzone zu verwenden. Dies beeinflusst, wie Zeiten im Standard-Modus angezeigt werden.
+
+timeline.time.your=Ihre Zeit
+timeline.time.local=Ortszeit
# Avatar
users.avatar.label=Profilbild
users.avatar.upload=Bild ausw\u00E4hlen
diff --git a/src/main/resources/messages_fi.properties b/src/main/resources/messages_fi.properties
index e5d29afd..270104b6 100644
--- a/src/main/resources/messages_fi.properties
+++ b/src/main/resources/messages_fi.properties
@@ -99,6 +99,21 @@ users.role.label=Rooli
users.role.admin=Yll\u00E4pit\u00E4j\u00E4
users.role.user=K\u00E4ytt\u00E4j\u00E4
users.delete.confirm=Oletko varma, ett\u00E4 haluat poistaa t\u00E4m\u00E4n k\u00E4ytt\u00E4j\u00E4n? T\u00E4m\u00E4 poistaa kaikki heid\u00E4n tietonsa.
+
+time.title=Aika
+time.display.mode.label=Ajan n\u00E4ytt\u00F6tapa
+time.display.mode.default=Oletus
+time.display.mode.geo.local=Geo-paikallinen
+time.display.mode.description=Valitse, miten ajat n\u00E4ytet\u00E4\u00E4n sovelluksessa.
+time.display.mode.default.description=Oletus: Kaikki ajat n\u00E4ytet\u00E4\u00E4n aikavy\u00F6hykkeess\u00E4si (selaimesta tai aikavy\u00F6hykkeen ohituksesta alla)
+time.display.mode.geo.local.description=Geo-paikallinen: Kaikki ajat n\u00E4ytet\u00E4\u00E4n siin\u00E4 aikavy\u00F6hykkeess\u00E4, jossa sijainti on
+time.timezone.override.label=Aikavy\u00F6hykkeen ohitus
+time.timezone.override.none=K\u00E4yt\u00E4 selaimen aikavy\u00F6hykett\u00E4
+time.timezone.override.description=Ohita aikavy\u00F6hykkeesi sen sijaan, ett\u00E4 k\u00E4ytt\u00E4isit selaimen havaitsemaa aikavy\u00F6hykett\u00E4. T\u00E4m\u00E4 vaikuttaa siihen, miten ajat n\u00E4ytet\u00E4\u00E4n Oletus-tilassa.
+
+timeline.time.your=Sinun aikasi
+timeline.time.local=Paikallinen aika
+
form.remove=Poista
# Avatar
diff --git a/src/main/resources/messages_fr.properties b/src/main/resources/messages_fr.properties
index 4de1af75..08c509f5 100644
--- a/src/main/resources/messages_fr.properties
+++ b/src/main/resources/messages_fr.properties
@@ -99,8 +99,22 @@ users.role.label=R\u00F4le
users.role.admin=Administrateur
users.role.user=Utilisateur
users.delete.confirm=\u00CAtes-vous s\u00FBr de vouloir supprimer cet utilisateur ? Cela supprimera toutes leurs donn\u00E9es.
+
+time.title=Heure
+time.display.mode.label=Mode d'affichage de l'heure
+time.display.mode.default=Par d\u00E9faut
+time.display.mode.geo.local=G\u00E9o-local
+time.display.mode.description=Choisissez comment les heures sont affich\u00E9es dans l'application.
+time.display.mode.default.description=Par d\u00E9faut : Toutes les heures sont affich\u00E9es dans votre fuseau horaire (du navigateur ou du remplacement de fuseau horaire ci-dessous)
+time.display.mode.geo.local.description=G\u00E9o-local : Toutes les heures sont affich\u00E9es dans le fuseau horaire o\u00F9 se trouve l'emplacement
+time.timezone.override.label=Remplacement du fuseau horaire
+time.timezone.override.none=Utiliser le fuseau horaire du navigateur
+time.timezone.override.description=Remplacez votre fuseau horaire au lieu d'utiliser le fuseau horaire d\u00E9tect\u00E9 par le navigateur. Cela affecte la fa\u00E7on dont les heures sont affich\u00E9es en mode Par d\u00E9faut.
+
form.remove=Supprimer
+timeline.time.your=Votre heure
+timeline.time.local=Heure locale
# Avatar
users.avatar.label=Photo de profil
diff --git a/src/main/resources/static/js/photo-client.js b/src/main/resources/static/js/photo-client.js
index 37963e90..7bba1d16 100644
--- a/src/main/resources/static/js/photo-client.js
+++ b/src/main/resources/static/js/photo-client.js
@@ -9,6 +9,7 @@ class PhotoClient {
/**
* Update photos for the selected date
* @param {string} date - Date in YYYY-MM-DD format
+ * @param timezone
*/
async updatePhotosForDate(date, timezone) {
this.currentDate = date;
diff --git a/src/main/resources/templates/fragments/timeline.html b/src/main/resources/templates/fragments/timeline.html
index 6a497a9c..30dcb29f 100644
--- a/src/main/resources/templates/fragments/timeline.html
+++ b/src/main/resources/templates/fragments/timeline.html
@@ -87,7 +87,12 @@
- 09:00 - 10:30
+ 09:00 - 10:30
+ 09:00 - 10:30
diff --git a/src/main/resources/templates/fragments/user-management.html b/src/main/resources/templates/fragments/user-management.html
index 7f9e5ca5..832dc227 100644
--- a/src/main/resources/templates/fragments/user-management.html
+++ b/src/main/resources/templates/fragments/user-management.html
@@ -214,6 +214,39 @@
+
+