diff --git a/models/user/setting_keys.go b/models/user/setting_keys.go
index 10255735b3177..653e8789a6762 100644
--- a/models/user/setting_keys.go
+++ b/models/user/setting_keys.go
@@ -12,4 +12,8 @@ const (
 	UserActivityPubPrivPem = "activitypub.priv_pem"
 	// UserActivityPubPubPem is user's public key
 	UserActivityPubPubPem = "activitypub.pub_pem"
+	// SettingsPreferAbsoluteTimestamps is the setting key for absolute timestamps
+	SettingsPreferAbsoluteTimestamps = "timestamps.prefer_absolute"
+	// SettingsPreferAbsoluteTimestampsDefault is the default setting value for absolute timestamps
+	SettingsPreferAbsoluteTimestampsDefault = "false"
 )
diff --git a/modules/timeutil/datetime.go b/modules/timeutil/datetime.go
index 80b96fa656be3..29078365c5391 100644
--- a/modules/timeutil/datetime.go
+++ b/modules/timeutil/datetime.go
@@ -7,11 +7,12 @@ import (
 	"fmt"
 	"html"
 	"html/template"
+	"strings"
 	"time"
 )
 
 // DateTime renders an absolute time HTML element by datetime.
-func DateTime(format string, datetime any) template.HTML {
+func DateTime(format string, datetime any, attrs ...string) template.HTML {
 	if p, ok := datetime.(*time.Time); ok {
 		datetime = *p
 	}
@@ -48,13 +49,15 @@ func DateTime(format string, datetime any) template.HTML {
 		panic(fmt.Sprintf("Unsupported time type %T", datetime))
 	}
 
+	extraAttrs := strings.Join(attrs, " ")
+
 	switch format {
 	case "short":
-		return template.HTML(fmt.Sprintf(`%s`, datetimeEscaped, textEscaped))
+		return template.HTML(fmt.Sprintf(`%s`, extraAttrs, datetimeEscaped, textEscaped))
 	case "long":
-		return template.HTML(fmt.Sprintf(`%s`, datetimeEscaped, textEscaped))
+		return template.HTML(fmt.Sprintf(`%s`, extraAttrs, datetimeEscaped, textEscaped))
 	case "full":
-		return template.HTML(fmt.Sprintf(`%s`, datetimeEscaped, textEscaped))
+		return template.HTML(fmt.Sprintf(`%s`, extraAttrs, datetimeEscaped, textEscaped))
 	}
 	panic(fmt.Sprintf("Unsupported format %s", format))
 }
diff --git a/modules/timeutil/since.go b/modules/timeutil/since.go
index 04fcff54a3384..ed63ebfee2ee1 100644
--- a/modules/timeutil/since.go
+++ b/modules/timeutil/since.go
@@ -4,14 +4,31 @@
 package timeutil
 
 import (
+	"context"
 	"fmt"
 	"html/template"
+	"strconv"
 	"strings"
 	"time"
 
+	"code.gitea.io/gitea/modules/log"
 	"code.gitea.io/gitea/modules/translation"
 )
 
+type PreferenceHelper struct {
+	GetSetting                              func(ctx context.Context, key string, def ...string) (string, error)
+	SettingsPreferAbsoluteTimestamps        string
+	SettingsPreferAbsoluteTimestampsDefault string
+}
+
+var preferenceHelper PreferenceHelper
+
+func Init(ph *PreferenceHelper) {
+	if ph != nil {
+		preferenceHelper = *ph
+	}
+}
+
 // Seconds-based time units
 const (
 	Minute = 60
@@ -131,11 +148,21 @@ func timeSinceUnix(then, now time.Time, lang translation.Locale) template.HTML {
 }
 
 // TimeSince renders relative time HTML given a time.Time
-func TimeSince(then time.Time, lang translation.Locale) template.HTML {
+func TimeSince(ctx context.Context, then time.Time, lang translation.Locale) template.HTML {
+	// if user prefers absolute timestamps, use the full time
+	val, err := preferenceHelper.GetSetting(ctx, preferenceHelper.SettingsPreferAbsoluteTimestamps, preferenceHelper.SettingsPreferAbsoluteTimestampsDefault)
+	if err != nil {
+		log.Error("GetSetting %w", err)
+	}
+	preferAbsoluteTimestamps, _ := strconv.ParseBool(val) // we can safely ignore the failed conversion here
+	if preferAbsoluteTimestamps {
+		return DateTime("full", then, `class="time-since"`)
+	}
+
 	return timeSinceUnix(then, time.Now(), lang)
 }
 
 // TimeSinceUnix renders relative time HTML given a TimeStamp
-func TimeSinceUnix(then TimeStamp, lang translation.Locale) template.HTML {
-	return TimeSince(then.AsLocalTime(), lang)
+func TimeSinceUnix(ctx context.Context, then TimeStamp, lang translation.Locale) template.HTML {
+	return TimeSince(ctx, then.AsLocalTime(), lang)
 }
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index 0072ac6fc36fa..b7f66b5b2f133 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -641,6 +641,9 @@ saved_successfully = Your settings were saved successfully.
 privacy = Privacy
 keep_activity_private = Hide the activity from the profile page
 keep_activity_private_popup = Makes the activity visible only for you and the admins
+timestamps = Timestamps
+prefer_absolute_timestamps = Prefer absolute timestamps
+prefer_absolute_timestamps_popup = Display timestamps as absolute dates instead of relative time
 
 lookup_avatar_by_mail = Look Up Avatar by Email Address
 federated_avatar_lookup = Federated Avatar Lookup
diff --git a/routers/web/repo/blame.go b/routers/web/repo/blame.go
index 0e232c194c2e1..0ee4516eb59a3 100644
--- a/routers/web/repo/blame.go
+++ b/routers/web/repo/blame.go
@@ -253,7 +253,7 @@ func renderBlame(ctx *context.Context, blameParts []git.BlamePart, commitNames m
 				commitCnt++
 
 				// User avatar image
-				commitSince := timeutil.TimeSinceUnix(timeutil.TimeStamp(commit.Author.When.Unix()), ctx.Locale)
+				commitSince := timeutil.TimeSinceUnix(ctx, timeutil.TimeStamp(commit.Author.When.Unix()), ctx.Locale)
 
 				var avatar string
 				if commit.User != nil {
diff --git a/routers/web/repo/issue_content_history.go b/routers/web/repo/issue_content_history.go
index 7e5295e757b7c..35a7179b60a90 100644
--- a/routers/web/repo/issue_content_history.go
+++ b/routers/web/repo/issue_content_history.go
@@ -74,7 +74,7 @@ func GetContentHistoryList(ctx *context.Context) {
 		class := avatars.DefaultAvatarClass + " gt-mr-3"
 		name := html.EscapeString(username)
 		avatarHTML := string(templates.AvatarHTML(src, 28, class, username))
-		timeSinceText := string(timeutil.TimeSinceUnix(item.EditedUnix, ctx.Locale))
+		timeSinceText := string(timeutil.TimeSinceUnix(ctx, item.EditedUnix, ctx.Locale))
 
 		results = append(results, map[string]interface{}{
 			"name":  avatarHTML + "" + name + " " + actionText + " " + timeSinceText,
diff --git a/routers/web/user/setting/profile.go b/routers/web/user/setting/profile.go
index 0a8a5e6280c46..0bd041f45fced 100644
--- a/routers/web/user/setting/profile.go
+++ b/routers/web/user/setting/profile.go
@@ -12,6 +12,7 @@ import (
 	"net/http"
 	"os"
 	"path/filepath"
+	"strconv"
 	"strings"
 
 	"code.gitea.io/gitea/models/db"
@@ -350,6 +351,14 @@ func Appearance(ctx *context.Context) {
 		return forms.IsUserHiddenCommentTypeGroupChecked(commentTypeGroup, hiddenCommentTypes)
 	}
 
+	val, err = user_model.GetUserSetting(ctx.Doer.ID, user_model.SettingsPreferAbsoluteTimestamps, user_model.SettingsPreferAbsoluteTimestampsDefault)
+	if err != nil {
+		ctx.ServerError("GetUserSetting", err)
+		return
+	}
+	preferAbsoluteTimestamps, _ := strconv.ParseBool(val) // we can safely ignore the failed conversion here
+	ctx.Data["PreferAbsoluteTimestamps"] = preferAbsoluteTimestamps
+
 	ctx.HTML(http.StatusOK, tplSettingsAppearance)
 }
 
@@ -421,3 +430,16 @@ func UpdateUserHiddenComments(ctx *context.Context) {
 	ctx.Flash.Success(ctx.Tr("settings.saved_successfully"))
 	ctx.Redirect(setting.AppSubURL + "/user/settings/appearance")
 }
+
+// UpdateUserTimestamps update a user's timestamp preferences
+func UpdateUserTimestamps(ctx *context.Context) {
+	err := user_model.SetUserSetting(ctx.Doer.ID, user_model.SettingsPreferAbsoluteTimestamps, strconv.FormatBool(forms.UserTimestampsFromRequest(ctx).PreferAbsoluteTimestamps))
+	if err != nil {
+		ctx.ServerError("SetUserSetting", err)
+		return
+	}
+
+	log.Trace("User settings updated: %s", ctx.Doer.Name)
+	ctx.Flash.Success(ctx.Tr("settings.saved_successfully"))
+	ctx.Redirect(setting.AppSubURL + "/user/settings/appearance")
+}
diff --git a/routers/web/web.go b/routers/web/web.go
index bb2442fec40ec..eaba150deb6b5 100644
--- a/routers/web/web.go
+++ b/routers/web/web.go
@@ -41,6 +41,7 @@ import (
 	context_service "code.gitea.io/gitea/services/context"
 	"code.gitea.io/gitea/services/forms"
 	"code.gitea.io/gitea/services/lfs"
+	user_service "code.gitea.io/gitea/services/user"
 
 	_ "code.gitea.io/gitea/modules/session" // to registers all internal adapters
 
@@ -397,6 +398,7 @@ func registerRoutes(m *web.Route) {
 	m.Get("/login/oauth/keys", ignSignInAndCsrf, auth.OIDCKeys)
 	m.Post("/login/oauth/introspect", CorsHandler(), web.Bind(forms.IntrospectTokenForm{}), ignSignInAndCsrf, auth.IntrospectOAuth)
 
+	user_service.Init()
 	m.Group("/user/settings", func() {
 		m.Get("", user_setting.Profile)
 		m.Post("", web.Bind(forms.UpdateProfileForm{}), user_setting.ProfilePost)
@@ -414,6 +416,7 @@ func registerRoutes(m *web.Route) {
 			m.Get("", user_setting.Appearance)
 			m.Post("/language", web.Bind(forms.UpdateLanguageForm{}), user_setting.UpdateUserLang)
 			m.Post("/hidden_comments", user_setting.UpdateUserHiddenComments)
+			m.Post("/timestamps", user_setting.UpdateUserTimestamps)
 			m.Post("/theme", web.Bind(forms.UpdateThemeForm{}), user_setting.UpdateUIThemePost)
 		})
 		m.Group("/security", func() {
diff --git a/services/forms/user_form.go b/services/forms/user_form.go
index 285bc398b26c5..a23b0ca9dc624 100644
--- a/services/forms/user_form.go
+++ b/services/forms/user_form.go
@@ -261,6 +261,11 @@ type UpdateLanguageForm struct {
 	Language string
 }
 
+// UpdateTimestampsForm form for updating profile
+type UpdateTimestampsForm struct {
+	PreferAbsoluteTimestamps bool
+}
+
 // Validate validates the fields
 func (f *UpdateLanguageForm) Validate(req *http.Request, errs binding.Errors) binding.Errors {
 	ctx := context.GetContext(req)
diff --git a/services/forms/user_form_timestamps.go b/services/forms/user_form_timestamps.go
new file mode 100644
index 0000000000000..41ea1bff8ad0c
--- /dev/null
+++ b/services/forms/user_form_timestamps.go
@@ -0,0 +1,14 @@
+// Copyright 2023 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package forms
+
+import (
+	"code.gitea.io/gitea/modules/context"
+)
+
+// UserTimestampsFromRequest parses the form for the absolute timestamps preference
+func UserTimestampsFromRequest(ctx *context.Context) *UpdateTimestampsForm {
+	timestampsForm := &UpdateTimestampsForm{PreferAbsoluteTimestamps: ctx.FormBool("prefer_absolute_timestamps")}
+	return timestampsForm
+}
diff --git a/services/user/user.go b/services/user/user.go
index d52a2f404bcf0..b6a1e3da21262 100644
--- a/services/user/user.go
+++ b/services/user/user.go
@@ -19,10 +19,12 @@ import (
 	system_model "code.gitea.io/gitea/models/system"
 	user_model "code.gitea.io/gitea/models/user"
 	"code.gitea.io/gitea/modules/avatar"
+	gitea_context "code.gitea.io/gitea/modules/context"
 	"code.gitea.io/gitea/modules/eventsource"
 	"code.gitea.io/gitea/modules/log"
 	"code.gitea.io/gitea/modules/setting"
 	"code.gitea.io/gitea/modules/storage"
+	"code.gitea.io/gitea/modules/timeutil"
 	"code.gitea.io/gitea/modules/util"
 	"code.gitea.io/gitea/services/packages"
 )
@@ -290,3 +292,19 @@ func DeleteAvatar(u *user_model.User) error {
 	}
 	return nil
 }
+
+func Init() {
+	timeutil.Init(&timeutil.PreferenceHelper{
+		GetSetting: func(ctx context.Context, key string, def ...string) (string, error) {
+			giteaCtx, ok := ctx.(*gitea_context.Context)
+
+			// this casting should always be ok but if it fails we have to provide a fallback
+			if !ok {
+				return "false", nil
+			}
+			return user_model.GetUserSetting(giteaCtx.Doer.ID, key, def...)
+		},
+		SettingsPreferAbsoluteTimestamps:        user_model.SettingsPreferAbsoluteTimestamps,
+		SettingsPreferAbsoluteTimestampsDefault: user_model.SettingsPreferAbsoluteTimestampsDefault,
+	})
+}
diff --git a/templates/admin/process-row.tmpl b/templates/admin/process-row.tmpl
index 8fd2d1af700dc..a7540879ce3f4 100644
--- a/templates/admin/process-row.tmpl
+++ b/templates/admin/process-row.tmpl
@@ -3,7 +3,7 @@
 		
{{if eq .Process.Type "request"}}{{svg "octicon-globe" 16}}{{else if eq .Process.Type "system"}}{{svg "octicon-cpu" 16}}{{else}}{{svg "octicon-terminal" 16}}{{end}}
 		
 			
-			
{{TimeSince .Process.Start .root.locale}}
+			
{{TimeSince $.Context .Process.Start .root.locale}}
 		
 			{{if ne .Process.Type "system"}}
diff --git a/templates/admin/stacktrace-row.tmpl b/templates/admin/stacktrace-row.tmpl
index 15e51e4aca7ce..874e634686f56 100644
--- a/templates/admin/stacktrace-row.tmpl
+++ b/templates/admin/stacktrace-row.tmpl
@@ -13,7 +13,7 @@
 		
 		
 			
-			
{{if ne .Process.Type "none"}}{{TimeSince .Process.Start .root.locale}}{{end}}
+			
{{if ne .Process.Type "none"}}{{TimeSince .root.Context .Process.Start .root.locale}}{{end}}
 		
 			{{if or (eq .Process.Type "request") (eq .Process.Type "normal")}}
diff --git a/templates/devtest/gitea-ui.tmpl b/templates/devtest/gitea-ui.tmpl
index 2fe478a07d8a0..d739b9b629021 100644
--- a/templates/devtest/gitea-ui.tmpl
+++ b/templates/devtest/gitea-ui.tmpl
@@ -26,13 +26,13 @@
 
 	
 		TimeSince
-		
Now: {{TimeSince .TimeNow $.locale}}
-		
5s past: {{TimeSince .TimePast5s $.locale}}
-		
5s future: {{TimeSince .TimeFuture5s $.locale}}
-		
2m past: {{TimeSince .TimePast2m $.locale}}
-		
2m future: {{TimeSince .TimeFuture2m $.locale}}
-		
1y past: {{TimeSince .TimePast1y $.locale}}
-		
1y future: {{TimeSince .TimeFuture1y $.locale}}
+		
Now: {{TimeSince $.Context .TimeNow $.locale}}
+		
5s past: {{TimeSince $.Context .TimePast5s $.locale}}
+		
5s future: {{TimeSince $.Context .TimeFuture5s $.locale}}
+		
2m past: {{TimeSince $.Context .TimePast2m $.locale}}
+		
2m future: {{TimeSince $.Context .TimeFuture2m $.locale}}
+		
1y past: {{TimeSince $.Context .TimePast1y $.locale}}
+		
1y future: {{TimeSince $.Context .TimeFuture1y $.locale}}
 	 
 
 	
diff --git a/templates/explore/repo_list.tmpl b/templates/explore/repo_list.tmpl
index b311472b43ed2..47e95ee22a171 100644
--- a/templates/explore/repo_list.tmpl
+++ b/templates/explore/repo_list.tmpl
@@ -60,7 +60,7 @@
 					{{end}}
 					
 				{{end}}
-				
{{$.locale.Tr "org.repo_updated"}} {{TimeSinceUnix .UpdatedUnix $.locale}}
+				
{{$.locale.Tr "org.repo_updated"}} {{TimeSinceUnix $.Context .UpdatedUnix $.locale}}
 			
-						{{$timeStr := TimeSinceUnix .Version.CreatedUnix $.locale}}
+						{{$timeStr := TimeSinceUnix $.Context .Version.CreatedUnix $.locale}}
 						{{$hasRepositoryAccess := false}}
 						{{if .Repository}}
 							{{$hasRepositoryAccess = index $.RepositoryAccessMap .Repository.ID}}
diff --git a/templates/package/shared/versionlist.tmpl b/templates/package/shared/versionlist.tmpl
index ba488586a82e6..157e0700aabd5 100644
--- a/templates/package/shared/versionlist.tmpl
+++ b/templates/package/shared/versionlist.tmpl
@@ -27,7 +27,7 @@
 						
{{.Version.LowerVersion}}
 					
-						{{$.locale.Tr "packages.published_by" (TimeSinceUnix .Version.CreatedUnix $.locale) .Creator.HomeLink (.Creator.GetDisplayName | Escape) | Safe}}
+						{{$.locale.Tr "packages.published_by" (TimeSinceUnix $.Context .Version.CreatedUnix $.locale) .Creator.HomeLink (.Creator.GetDisplayName | Escape) | Safe}}
 					
 				
 			
diff --git a/templates/package/view.tmpl b/templates/package/view.tmpl
index 3cb130851fee1..86d74c05cb432 100644
--- a/templates/package/view.tmpl
+++ b/templates/package/view.tmpl
@@ -9,7 +9,7 @@
 						{{.PackageDescriptor.Package.Name}} ({{.PackageDescriptor.Version.Version}})
 					
 					
-						{{$timeStr := TimeSinceUnix .PackageDescriptor.Version.CreatedUnix $.locale}}
+						{{$timeStr := TimeSinceUnix $.Context .PackageDescriptor.Version.CreatedUnix $.locale}}
 						{{if .HasRepositoryAccess}}
 							{{.locale.Tr "packages.published_by_in" $timeStr .PackageDescriptor.Creator.HomeLink (.PackageDescriptor.Creator.GetDisplayName | Escape) .PackageDescriptor.Repository.Link (.PackageDescriptor.Repository.FullName | Escape) | Safe}}
 						{{else}}
@@ -44,7 +44,7 @@
 							{{if .HasRepositoryAccess}}
 							
 							{{end}}
-							
{{svg "octicon-calendar" 16 "gt-mr-3"}} {{TimeSinceUnix .PackageDescriptor.Version.CreatedUnix $.locale}}
+							
{{svg "octicon-calendar" 16 "gt-mr-3"}} {{TimeSinceUnix $.Context .PackageDescriptor.Version.CreatedUnix $.locale}}
 							{{svg "octicon-download" 16 "gt-mr-3"}} {{.PackageDescriptor.Version.DownloadCount}}
 							{{template "package/metadata/cargo" .}}
 							{{template "package/metadata/chef" .}}
diff --git a/templates/projects/list.tmpl b/templates/projects/list.tmpl
index ac4b34a960f25..3c4c9cee8497a 100644
--- a/templates/projects/list.tmpl
+++ b/templates/projects/list.tmpl
@@ -40,7 +40,7 @@
 				
 					{{svg .IconName}} {{.Title}}
 					
 			
-				
{{TimeSinceUnix .Updated $.locale}}
+				
{{TimeSinceUnix $.Context .Updated $.locale}}
 				{{.Duration}}
 			
diff --git a/templates/repo/activity.tmpl b/templates/repo/activity.tmpl
index 9d15cec051bfe..32771fd977c31 100644
--- a/templates/repo/activity.tmpl
+++ b/templates/repo/activity.tmpl
@@ -131,7 +131,7 @@
 						{{if not .IsTag}}
 							
{{.Title | RenderEmoji $.Context}}
 						{{end}}
-						{{TimeSinceUnix .CreatedUnix $.locale}}
+						{{TimeSinceUnix $.Context .CreatedUnix $.locale}}
 					
 				{{end}}
 			
 						{{$.locale.Tr "repo.activity.merged_prs_label"}}
 						#{{.Index}} {{.Issue.Title | RenderEmoji $.Context}}
-						{{TimeSinceUnix .MergedUnix $.locale}}
+						{{TimeSinceUnix $.Context .MergedUnix $.locale}}
 					
 				{{end}}
 			
@@ -169,7 +169,7 @@
 					
 						{{$.locale.Tr "repo.activity.opened_prs_label"}}
 						#{{.Index}} {{.Issue.Title | RenderEmoji $.Context}}
-						{{TimeSinceUnix .Issue.CreatedUnix $.locale}}
+						{{TimeSinceUnix $.Context .Issue.CreatedUnix $.locale}}
 					
 				{{end}}
 			
@@ -188,7 +188,7 @@
 					
 						{{$.locale.Tr "repo.activity.closed_issue_label"}}
 						#{{.Index}} {{.Title | RenderEmoji $.Context}}
-						{{TimeSinceUnix .ClosedUnix $.locale}}
+						{{TimeSinceUnix $.Context .ClosedUnix $.locale}}
 					
 				{{end}}
 			
@@ -207,7 +207,7 @@
 					
 						{{$.locale.Tr "repo.activity.new_issue_label"}}
 						#{{.Index}} {{.Title | RenderEmoji $.Context}}
-						{{TimeSinceUnix .CreatedUnix $.locale}}
+						{{TimeSinceUnix $.Context .CreatedUnix $.locale}}
 					
 				{{end}}
 			
@@ -231,7 +231,7 @@
 						{{else}}
 						{{.Title | RenderEmoji $.Context}}
 						{{end}}
-						{{TimeSinceUnix .UpdatedUnix $.locale}}
+						{{TimeSinceUnix $.Context .UpdatedUnix $.locale}}
 					
 				{{end}}
 			
diff --git a/templates/repo/branch/list.tmpl b/templates/repo/branch/list.tmpl
index 596d9ae78bd67..0dd5c565cd2ba 100644
--- a/templates/repo/branch/list.tmpl
+++ b/templates/repo/branch/list.tmpl
@@ -18,7 +18,7 @@
 									{{svg "octicon-shield-lock"}}
 								{{end}}
 								{{.DefaultBranch}}
-								{{svg "octicon-git-commit" 16 "gt-mr-2"}}{{ShortSha .DefaultBranchBranch.Commit.ID.String}} · {{RenderCommitMessage $.Context .DefaultBranchBranch.Commit.CommitMessage .RepoLink .Repository.ComposeMetas}} · {{.locale.Tr "org.repo_updated"}} {{TimeSince .DefaultBranchBranch.Commit.Committer.When .locale}}
+								{{svg "octicon-git-commit" 16 "gt-mr-2"}}{{ShortSha .DefaultBranchBranch.Commit.ID.String}} · {{RenderCommitMessage $.Context .DefaultBranchBranch.Commit.CommitMessage .RepoLink .Repository.ComposeMetas}} · {{.locale.Tr "org.repo_updated"}} {{TimeSince .Context .DefaultBranchBranch.Commit.Committer.When .locale}}
 							
 							{{if and $.IsWriter (not $.Repository.IsArchived) (not .IsDeleted)}}
@@ -60,13 +60,13 @@ | {{if .IsDeleted}} {{.Name}}-{{$.locale.Tr "repo.branch.deleted_by" .DeletedBranch.DeletedBy.Name}} {{TimeSinceUnix .DeletedBranch.DeletedUnix $.locale}}+ {{$.locale.Tr "repo.branch.deleted_by" .DeletedBranch.DeletedBy.Name}} {{TimeSinceUnix $.Context .DeletedBranch.DeletedUnix $.locale}}{{else}}
 										{{if .IsProtected}}
 											{{svg "octicon-shield-lock"}}
 										{{end}}
 										{{.Name}}
- {{svg "octicon-git-commit" 16 "gt-mr-2"}}{{ShortSha .Commit.ID.String}} · {{RenderCommitMessage $.Context .Commit.CommitMessage $.RepoLink $.Repository.ComposeMetas}} · {{$.locale.Tr "org.repo_updated"}} {{TimeSince .Commit.Committer.When $.locale}}+ {{svg "octicon-git-commit" 16 "gt-mr-2"}}{{ShortSha .Commit.ID.String}} · {{RenderCommitMessage $.Context .Commit.CommitMessage $.RepoLink $.Repository.ComposeMetas}} · {{$.locale.Tr "org.repo_updated"}} {{TimeSince $.Context .Commit.Committer.When $.locale}}{{end}} | diff --git a/templates/repo/commit_page.tmpl b/templates/repo/commit_page.tmpl
index 5e26c04fd879c..00f192245f2ea 100644
--- a/templates/repo/commit_page.tmpl
+++ b/templates/repo/commit_page.tmpl
@@ -156,7 +156,7 @@
 						{{avatarByEmail $.Context .Commit.Author.Email .Commit.Author.Email 28 "gt-mr-3"}}
 						{{.Commit.Author.Name}}
 					{{end}}
-					{{TimeSince .Commit.Author.When $.locale}}
+					{{TimeSince $.Context .Commit.Author.When $.locale}}
 					{{if or (ne .Commit.Committer.Name .Commit.Author.Name) (ne .Commit.Committer.Email .Commit.Author.Email)}}
 						{{.locale.Tr "repo.diff.committed_by"}}
 						{{if ne .Verification.CommittingUser.ID 0}}
@@ -277,7 +277,7 @@
 				{{else}}
 					{{.NoteCommit.Author.Name}}
 				{{end}}
-				{{TimeSince .NoteCommit.Author.When $.locale}}
+				{{TimeSince $.Context .NoteCommit.Author.When $.locale}} {{if .Committer}}
-
 				{{RenderNote $.Context .Note $.RepoLink $.Repository.ComposeMetas}}
diff --git a/templates/repo/commits_list.tmpl b/templates/repo/commits_list.tmpl
index 36333c554079c..ae15fa5844495 100644
--- a/templates/repo/commits_list.tmpl
+++ b/templates/repo/commits_list.tmpl
@@ -76,9 +76,9 @@
 							{{end}}
 						 | {{TimeSince .Committer.When $.locale}}+ | {{TimeSince $.Context .Committer.When $.locale}}{{else}}
- | {{TimeSince .Author.When $.locale}}+ | {{TimeSince $.Context .Author.When $.locale}}{{end}}
 					
 				{{end}}
diff --git a/templates/repo/diff/comments.tmpl b/templates/repo/diff/comments.tmpl
index f30126153307a..7c4067b9db9b7 100644
--- a/templates/repo/diff/comments.tmpl
+++ b/templates/repo/diff/comments.tmpl
@@ -1,6 +1,6 @@
 {{range .comments}}
 
-{{$createdStr:= TimeSinceUnix .CreatedUnix $.root.locale}}
+{{$createdStr:= TimeSinceUnix $.root.Context .CreatedUnix $.root.locale}} | 
 			
-				{{$closedDate:= TimeSinceUnix .Milestone.ClosedDateUnix $.locale}}
+				{{$closedDate:= TimeSinceUnix $.Context .Milestone.ClosedDateUnix $.locale}}
 				{{if .IsClosed}}
 					{{svg "octicon-clock"}} {{$.locale.Tr "repo.milestones.closed" $closedDate | Safe}}
 				{{else}}
diff --git a/templates/repo/issue/milestones.tmpl b/templates/repo/issue/milestones.tmpl
index 3a23d225c4306..5487ff0b53eb6 100644
--- a/templates/repo/issue/milestones.tmpl
+++ b/templates/repo/issue/milestones.tmpl
@@ -71,7 +71,7 @@
 						
 					 
 					
-						{{$closedDate:= TimeSinceUnix .ClosedDateUnix $.locale}}
+						{{$closedDate:= TimeSinceUnix $.Context .ClosedDateUnix $.locale}}
 						{{if .IsClosed}}
 							{{svg "octicon-clock"}} {{$.locale.Tr "repo.milestones.closed" $closedDate | Safe}}
 						{{else}}
@@ -88,7 +88,7 @@
 							{{svg "octicon-check" 16 "gt-mr-3"}}
 							{{$.locale.PrettyNumber .NumClosedIssues}} {{$.locale.Tr "repo.issues.closed_title"}}
 							{{if .TotalTrackedTime}}{{svg "octicon-clock"}} {{.TotalTrackedTime|Sec2Time}}{{end}}
-							{{if .UpdatedUnix}}{{svg "octicon-clock"}} {{$.locale.Tr "repo.milestones.update_ago" (TimeSinceUnix .UpdatedUnix $.locale) | Safe}}{{end}}
+							{{if .UpdatedUnix}}{{svg "octicon-clock"}} {{$.locale.Tr "repo.milestones.update_ago" (TimeSinceUnix $.Context .UpdatedUnix $.locale) | Safe}}{{end}}
 						
 					
 					{{if and (or $.CanWriteIssues $.CanWritePulls) (not $.Repository.IsArchived)}}
diff --git a/templates/repo/issue/view_content.tmpl b/templates/repo/issue/view_content.tmpl
index 7d3bce2b6a872..712c121500bd3 100644
--- a/templates/repo/issue/view_content.tmpl
+++ b/templates/repo/issue/view_content.tmpl
@@ -15,7 +15,7 @@
 	
 	
 
-	{{$createdStr:= TimeSinceUnix .Issue.CreatedUnix $.locale}}
+	{{$createdStr:= TimeSinceUnix $.Context .Issue.CreatedUnix $.locale}}
 	
+ {{.locale.Tr "settings.timestamps"}} +
+{{.locale.Tr "settings.hidden_comment_types"}} diff --git a/templates/user/settings/security/webauthn.tmpl b/templates/user/settings/security/webauthn.tmpl index 59022eb1c976d..ada7ac78183c8 100644 --- a/templates/user/settings/security/webauthn.tmpl +++ b/templates/user/settings/security/webauthn.tmpl @@ -14,7 +14,7 @@
 					{{.Name}}
 				 
-				{{TimeSinceUnix .CreatedUnix $.locale}}
+				{{TimeSinceUnix $.Context .CreatedUnix $.locale}}