From 5e0ad765e137936fb84e4d00fd7971e0379f22c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ota=CC=81vio=20Cordeiro?= Date: Wed, 24 Dec 2025 16:28:13 +0100 Subject: [PATCH] =?UTF-8?q?Use=20user=E2=80=99s=20timezone=20for=20blog=20?= =?UTF-8?q?post=20time?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DateFormatter+Weblog.swift | 10 +++-- .../FoundationExtensions/String+Weblog.swift | 7 +++- .../StringWeblogTests.swift | 42 ++++++++++++------- 3 files changed, 40 insertions(+), 19 deletions(-) diff --git a/Packages/FoundationExtensions/Sources/FoundationExtensions/DateFormatter+Weblog.swift b/Packages/FoundationExtensions/Sources/FoundationExtensions/DateFormatter+Weblog.swift index 51c366d..4183b7e 100644 --- a/Packages/FoundationExtensions/Sources/FoundationExtensions/DateFormatter+Weblog.swift +++ b/Packages/FoundationExtensions/Sources/FoundationExtensions/DateFormatter+Weblog.swift @@ -6,17 +6,19 @@ public extension DateFormatter { /// /// This formatter produces ISO 8601 compatible date strings with short time /// 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. /// /// Output format: `YYYY-MM-DD HH:MM` /// /// Example: `2024-03-15 14:30` - static let iso8601WithShortTime: DateFormatter = { + static func iso8601WithShortTime( + timeZone: TimeZone + ) -> DateFormatter { let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd HH:mm" formatter.locale = Locale(identifier: "en_US_POSIX") - formatter.timeZone = TimeZone(secondsFromGMT: 0) + formatter.timeZone = timeZone return formatter - }() + } } diff --git a/Packages/FoundationExtensions/Sources/FoundationExtensions/String+Weblog.swift b/Packages/FoundationExtensions/Sources/FoundationExtensions/String+Weblog.swift index a4d4a6b..991614e 100644 --- a/Packages/FoundationExtensions/Sources/FoundationExtensions/String+Weblog.swift +++ b/Packages/FoundationExtensions/Sources/FoundationExtensions/String+Weblog.swift @@ -21,16 +21,21 @@ public extension String { /// /// - Parameters: /// - 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 /// Only", "Unlisted") /// - 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 func weblogEntryBody( date: Date, + timeZone: TimeZone = .current, status: String, tags: [String] ) -> Data { - let formattedString = DateFormatter.iso8601WithShortTime.string(from: date) + let formattedString = DateFormatter + .iso8601WithShortTime(timeZone: timeZone) + .string(from: date) + var frontmatter = """ --- Date: \(formattedString) diff --git a/Packages/FoundationExtensions/Tests/FoundationExtensionsTests/StringWeblogTests.swift b/Packages/FoundationExtensions/Tests/FoundationExtensionsTests/StringWeblogTests.swift index 4eb5211..15c7dc4 100644 --- a/Packages/FoundationExtensions/Tests/FoundationExtensionsTests/StringWeblogTests.swift +++ b/Packages/FoundationExtensions/Tests/FoundationExtensionsTests/StringWeblogTests.swift @@ -22,8 +22,9 @@ struct StringWeblogTests { """ // When - let result = content.weblogEntryBody( + let result = try content.weblogEntryBody( date: date, + timeZone: #require(TimeZone(secondsFromGMT: 0)), status: status, tags: tags ) @@ -57,8 +58,9 @@ struct StringWeblogTests { """ // When - let result = content.weblogEntryBody( + let result = try content.weblogEntryBody( date: date, + timeZone: #require(TimeZone(secondsFromGMT: 0)), status: status, tags: tags ) @@ -91,8 +93,9 @@ struct StringWeblogTests { """ // When - let result = content.weblogEntryBody( + let result = try content.weblogEntryBody( date: date, + timeZone: #require(TimeZone(secondsFromGMT: 0)), status: status, tags: tags ) @@ -125,8 +128,9 @@ struct StringWeblogTests { """ // When - let result = content.weblogEntryBody( + let result = try content.weblogEntryBody( date: date, + timeZone: #require(TimeZone(secondsFromGMT: 0)), status: status, tags: tags ) @@ -159,8 +163,9 @@ struct StringWeblogTests { """ // When - let result = content.weblogEntryBody( + let result = try content.weblogEntryBody( date: date, + timeZone: #require(TimeZone(secondsFromGMT: 0)), status: status, tags: tags ) @@ -194,8 +199,9 @@ struct StringWeblogTests { """ // When - let result = content.weblogEntryBody( + let result = try content.weblogEntryBody( date: date, + timeZone: #require(TimeZone(secondsFromGMT: 0)), status: status, tags: tags ) @@ -229,8 +235,9 @@ struct StringWeblogTests { """ // When - let result = content.weblogEntryBody( + let result = try content.weblogEntryBody( date: date, + timeZone: #require(TimeZone(secondsFromGMT: 0)), status: status, tags: tags ) @@ -265,8 +272,9 @@ struct StringWeblogTests { """ // When - let result = content.weblogEntryBody( + let result = try content.weblogEntryBody( date: date, + timeZone: #require(TimeZone(secondsFromGMT: 0)), status: status, tags: tags ) @@ -291,8 +299,9 @@ struct StringWeblogTests { let tags: [String] = [] // When - let result = content.weblogEntryBody( + let result = try content.weblogEntryBody( date: date, + timeZone: #require(TimeZone(secondsFromGMT: 0)), status: status, tags: tags ) @@ -325,8 +334,9 @@ struct StringWeblogTests { """ // When - let result = content.weblogEntryBody( + let result = try content.weblogEntryBody( date: date, + timeZone: #require(TimeZone(secondsFromGMT: 0)), status: status, tags: tags ) @@ -360,8 +370,9 @@ struct StringWeblogTests { """ // When - let result = content.weblogEntryBody( + let result = try content.weblogEntryBody( date: date, + timeZone: #require(TimeZone(secondsFromGMT: 0)), status: status, tags: tags ) @@ -394,8 +405,9 @@ struct StringWeblogTests { """ // When - let result = content.weblogEntryBody( + let result = try content.weblogEntryBody( date: date, + timeZone: #require(TimeZone(secondsFromGMT: 0)), status: status, tags: tags ) @@ -429,8 +441,9 @@ struct StringWeblogTests { """ // When - let result = content.weblogEntryBody( + let result = try content.weblogEntryBody( date: date, + timeZone: #require(TimeZone(secondsFromGMT: 0)), status: status, tags: tags ) @@ -465,8 +478,9 @@ struct StringWeblogTests { """ // When - let result = content.weblogEntryBody( + let result = try content.weblogEntryBody( date: date, + timeZone: #require(TimeZone(secondsFromGMT: 0)), status: status, tags: tags )