Use user’s timezone for blog post time

This commit is contained in:
Otávio Cordeiro 2025-12-24 16:28:13 +01:00 committed by Otávio
parent e1098916ab
commit 5e0ad765e1
3 changed files with 40 additions and 19 deletions

View file

@ -6,17 +6,19 @@ public extension DateFormatter {
/// ///
/// This formatter produces ISO 8601 compatible date strings with short time /// This formatter produces ISO 8601 compatible date strings with short time
/// format, specifically designed for use in weblog entry frontmatter. The /// format, specifically designed for use in weblog entry frontmatter. The
/// formatter uses GMT+0 timezone and POSIX locale for consistent formatting /// formatter uses the user timezone and POSIX locale for consistent formatting
/// across different system configurations. /// across different system configurations.
/// ///
/// Output format: `YYYY-MM-DD HH:MM` /// Output format: `YYYY-MM-DD HH:MM`
/// ///
/// Example: `2024-03-15 14:30` /// Example: `2024-03-15 14:30`
static let iso8601WithShortTime: DateFormatter = { static func iso8601WithShortTime(
timeZone: TimeZone
) -> DateFormatter {
let formatter = DateFormatter() let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm" formatter.dateFormat = "yyyy-MM-dd HH:mm"
formatter.locale = Locale(identifier: "en_US_POSIX") formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(secondsFromGMT: 0) formatter.timeZone = timeZone
return formatter return formatter
}() }
} }

View file

@ -21,16 +21,21 @@ public extension String {
/// ///
/// - Parameters: /// - Parameters:
/// - date: The publication date to include in the frontmatter /// - date: The publication date to include in the frontmatter
/// - timeZone: The timezone used for the publication (defaults to user's current timezone)
/// - status: The publication status to include in the frontmatter (e.g., "Draft", "Live", "Feed Only", "Web /// - status: The publication status to include in the frontmatter (e.g., "Draft", "Live", "Feed Only", "Web
/// Only", "Unlisted") /// Only", "Unlisted")
/// - tags: An array of tags to include in the frontmatter. Tags are comma-separated. /// - tags: An array of tags to include in the frontmatter. Tags are comma-separated.
/// - Returns: UTF-8 encoded data containing the formatted weblog entry body /// - Returns: UTF-8 encoded data containing the formatted weblog entry body
func weblogEntryBody( func weblogEntryBody(
date: Date, date: Date,
timeZone: TimeZone = .current,
status: String, status: String,
tags: [String] tags: [String]
) -> Data { ) -> Data {
let formattedString = DateFormatter.iso8601WithShortTime.string(from: date) let formattedString = DateFormatter
.iso8601WithShortTime(timeZone: timeZone)
.string(from: date)
var frontmatter = """ var frontmatter = """
--- ---
Date: \(formattedString) Date: \(formattedString)

View file

@ -22,8 +22,9 @@ struct StringWeblogTests {
""" """
// When // When
let result = content.weblogEntryBody( let result = try content.weblogEntryBody(
date: date, date: date,
timeZone: #require(TimeZone(secondsFromGMT: 0)),
status: status, status: status,
tags: tags tags: tags
) )
@ -57,8 +58,9 @@ struct StringWeblogTests {
""" """
// When // When
let result = content.weblogEntryBody( let result = try content.weblogEntryBody(
date: date, date: date,
timeZone: #require(TimeZone(secondsFromGMT: 0)),
status: status, status: status,
tags: tags tags: tags
) )
@ -91,8 +93,9 @@ struct StringWeblogTests {
""" """
// When // When
let result = content.weblogEntryBody( let result = try content.weblogEntryBody(
date: date, date: date,
timeZone: #require(TimeZone(secondsFromGMT: 0)),
status: status, status: status,
tags: tags tags: tags
) )
@ -125,8 +128,9 @@ struct StringWeblogTests {
""" """
// When // When
let result = content.weblogEntryBody( let result = try content.weblogEntryBody(
date: date, date: date,
timeZone: #require(TimeZone(secondsFromGMT: 0)),
status: status, status: status,
tags: tags tags: tags
) )
@ -159,8 +163,9 @@ struct StringWeblogTests {
""" """
// When // When
let result = content.weblogEntryBody( let result = try content.weblogEntryBody(
date: date, date: date,
timeZone: #require(TimeZone(secondsFromGMT: 0)),
status: status, status: status,
tags: tags tags: tags
) )
@ -194,8 +199,9 @@ struct StringWeblogTests {
""" """
// When // When
let result = content.weblogEntryBody( let result = try content.weblogEntryBody(
date: date, date: date,
timeZone: #require(TimeZone(secondsFromGMT: 0)),
status: status, status: status,
tags: tags tags: tags
) )
@ -229,8 +235,9 @@ struct StringWeblogTests {
""" """
// When // When
let result = content.weblogEntryBody( let result = try content.weblogEntryBody(
date: date, date: date,
timeZone: #require(TimeZone(secondsFromGMT: 0)),
status: status, status: status,
tags: tags tags: tags
) )
@ -265,8 +272,9 @@ struct StringWeblogTests {
""" """
// When // When
let result = content.weblogEntryBody( let result = try content.weblogEntryBody(
date: date, date: date,
timeZone: #require(TimeZone(secondsFromGMT: 0)),
status: status, status: status,
tags: tags tags: tags
) )
@ -291,8 +299,9 @@ struct StringWeblogTests {
let tags: [String] = [] let tags: [String] = []
// When // When
let result = content.weblogEntryBody( let result = try content.weblogEntryBody(
date: date, date: date,
timeZone: #require(TimeZone(secondsFromGMT: 0)),
status: status, status: status,
tags: tags tags: tags
) )
@ -325,8 +334,9 @@ struct StringWeblogTests {
""" """
// When // When
let result = content.weblogEntryBody( let result = try content.weblogEntryBody(
date: date, date: date,
timeZone: #require(TimeZone(secondsFromGMT: 0)),
status: status, status: status,
tags: tags tags: tags
) )
@ -360,8 +370,9 @@ struct StringWeblogTests {
""" """
// When // When
let result = content.weblogEntryBody( let result = try content.weblogEntryBody(
date: date, date: date,
timeZone: #require(TimeZone(secondsFromGMT: 0)),
status: status, status: status,
tags: tags tags: tags
) )
@ -394,8 +405,9 @@ struct StringWeblogTests {
""" """
// When // When
let result = content.weblogEntryBody( let result = try content.weblogEntryBody(
date: date, date: date,
timeZone: #require(TimeZone(secondsFromGMT: 0)),
status: status, status: status,
tags: tags tags: tags
) )
@ -429,8 +441,9 @@ struct StringWeblogTests {
""" """
// When // When
let result = content.weblogEntryBody( let result = try content.weblogEntryBody(
date: date, date: date,
timeZone: #require(TimeZone(secondsFromGMT: 0)),
status: status, status: status,
tags: tags tags: tags
) )
@ -465,8 +478,9 @@ struct StringWeblogTests {
""" """
// When // When
let result = content.weblogEntryBody( let result = try content.weblogEntryBody(
date: date, date: date,
timeZone: #require(TimeZone(secondsFromGMT: 0)),
status: status, status: status,
tags: tags tags: tags
) )