在 iPhone 上按日期排序文字訊息需要一個兩步驟的變通方法,因為 iOS 上的訊息 App 並沒有內建排序、篩選或反向時間順序切換的功能 — 每段對話都會依照 Apple App 決定的順序顯示,而唯一可用來查看較舊訊息的原生工具,只有搜尋欄位以及緩慢地向上捲動經過可見的日期標記。可靠的工作流程是:將每則訊息各自放在一行純文字中、把這些行從你的 iPhone 或其備份複製出來、貼到一個在本機執行的瀏覽器型排序工具中,然後讓該工具使用明確的控制項來重新排序,包括方向、大小寫、數字感知、修剪、移除空行,以及處理完全重複的行。Text Sorter 就是為第二步設計的:它最多接受 50,000 邏輯行,使用穩定的英文瀏覽器定序規則重新排序,統一混合的 CRLF、CR 與 LF 換行格式,並回傳一個絕不會離開裝置的可下載 UTF-8 文字檔。因為每行都會保持原始形式(除非啟用修剪),你在每一行上所加的日期戳記都會保持完整,重新排序也絕不會更動訊息本身的文字。

為何 iPhone 訊息 App 沒有按日期排序的控制項
iPhone 訊息 App 會以 Apple 軟體決定的固定順序顯示對話。在單一對話串中,最新的對話泡泡會固定在最下方,較舊的泡泡則顯示在上方,但這個順序是固定的 — 沒有任何按鈕、滑動或設定可以將對話串從「最舊在上、最新的在下」重新排序,也沒有任何方法可以反轉列表檢視中所有對話的順序。因此,要查看較舊的訊息只能依賴三項已記載的原生機制:訊息列表頂端的搜尋列、緩慢向上捲動以在你跨越每一天的界線時顯示浮動的日期標記,以及 iOS 17 搜尋篩選器(可將結果縮小到特定對象或附件類型)。這些機制都不會重新排序底層資料;它們只是幫助你在 Apple 已選定的順序中進行導覽。
對於想要從嚴格意義上按日期排序訊息的讀者 — 也就是取得一組訊息,並依時間順序從最早的開始排列 — 上述任何導覽工具都不足夠。iPhone 上的訊息資料庫是位於 iOS 沙箱內的 SQLite 檔案,而 Apple 並未提供使用者層級的匯出功能,讓你匯出一份每則訊息獨立成一行、且前面帶有日期戳記的檔案。那個轉換步驟正是缺失的一環,而它必須在任何排序工具能幫上忙之前先完成。
以逐行格式從 iPhone 取出訊息文字
因為訊息 App 不會匯出純文字傾印,你必須自行組裝。四種已記載的路徑可產生大致符合需求的文字,而每一種會產生略為不同的輸出,進而影響 Text Sorter 能對它做什麼。
- 從對話中複製並貼上。 長按對話泡泡,選擇「拷貝」,然後貼到備忘錄 App 或任何文字編輯器。這會只產生泡泡文字,沒有日期、沒有寄件者標籤,因此除非你也複製了在對話串中往回捲動時出現的浮動日期標記,否則這是對時間排序而言最弱的選項。
- 擷取對話畫面。捲動對話串並擷取多張畫面,可以捕捉到 iOS 在每一天界線上方顯示的日期標記,但產生的影像是圖片而非文字,無法在先經過 OCR 之前直接貼到逐行排序工具中。
- 在 Mac 上使用 Finder 匯出。當 iPhone 連接到執行 macOS Catalina 或以上版本的 Mac 時,Finder 中的「將你 iPhone 上的所有資料備份到此 Mac」選項會建立一個本機備份,其中包含訊息的 SQLite 資料庫。在本機讀取該備份的工具可以輸出一份每則訊息一行的文字檔,且每行都帶有時間戳記,這是最乾淨的排序器輸入。
- 使用第三方 iOS App。App Store 上有幾款 App 可將對話匯出為 CSV、TXT 或 PDF,並附帶時間戳記與寄件者標籤。當匯出格式為每則訊息一行、且前面帶有日期時,結果可直接放入逐行排序工具。
無論選擇哪一種路徑,你想要的格式都是每則訊息一行,並在開頭加上日期字串 — 範例:2024-03-15 09:42 — Alex: See you at noon。一旦你的檔案(不論是在磁碟上或在剪貼簿中)長成那個樣子,排序步驟就變成機械式的操作。
使用 Text Sorter 將匯出的行依時間順序排序
在剪貼簿或純文字檔中備好逐行匯出的內容後,排序本身是在 Text Sorter 頁面中三個已記載的步驟。該工具完全在你的瀏覽器中執行,並使用瀏覽器的英文定序規則來比較行,因此在同一裝置上,相同的輸入與相同的選項永遠會產生相同的輸出。
- 貼上要排序的逐行文字。在同一裝置上開啟 Text Sorter 頁面,點入輸入區,然後貼上匯出的訊息。該工具最多接受 1,000,000 個 UTF-16 程式碼單位,以及最多 50,000 邏輯行,並能將 CRLF、單獨的 CR 以及 LF 識別為行分隔符號。超過上限的貼上會在任何排序執行前被拒絕,因此你不會得到不完整的結果。
- 選擇方向、大小寫與數字比較方式,然後只啟用你需要的清理控制項。選擇「遞增」可將最早的日期戳記排在結果最上方,或選擇「遞減」以將最新的排在最上方。當大小寫敏感度關閉時,僅大小寫不同的字母會被視為相等;如果你的日期格式使用大寫的月份縮寫且希望嚴格比較,請將其開啟。當你的時間戳記或標籤內含多位數字(例如 file2 與 file10)時,「自然數字順序」相當實用,因為它會以數值方式比較數字序列,而非逐字元比較。此外,只有在你的匯出內容含有雜散空格、空白列或重複行時,才分別啟用「修剪每行」、「移除空行」以及「移除完全重複行」。
- 排序行、檢查前後計數與精確預覽,然後下載 TXT 結果。點擊排序動作並檢查預覽面板。所回報的原始邏輯行計數與最終行計數,僅在移除了空行或完全重複行時才會不同 — 排序本身永遠不會改變計數。當預覽符合你預期的順序時,點擊下載以儲存 UTF-8 文字檔。下載是透過一個短暫的 Blob URL 建立,瀏覽器一開始檔案傳輸就會立即撤銷該 URL,而整個工作流程中絕不會上傳任何資料。
Text Sorter 的每項設定如何影響你的日期順序
排序訊息行主要是把比較規則設定正確。Text Sorter 將每條規則各自暴露為獨立開關,而清理控制項的執行順序也已記載:選擇性的修剪最先執行,接著空行移除使用修剪後的結果,然後完全重複行移除再作用於剩下的內容,最後才由裝飾後的穩定排序比較倖存的行。
| 設定 | 它對你按日期排序的行所做的事 |
|---|---|
| 方向:遞增 | 最早的日期在最上方,最晚的在最下方。 |
| 方向:遞減 | 最新的日期在最上方,最早的在最下方;等價的項目會保留其原始相對順序。 |
| 大小寫敏感度:關閉 | 2024-03-15 與 2024-03-15 比較結果相同;如果你的匯出使用大小寫混用的月份名稱,這個設定很有用。 |
| 大小寫敏感度:開啟 | 大小寫會參與定序,因此 Mar 與 mar 會被分開排序。 |
| 自然數字順序:開啟 | 數字序列以數值方式比較;2024-03-02 會排在 2024-03-10 之前。 |
| 自然數字順序:關閉 | 相同的值在相同的定序器下會以一般文字方式比較。 |
| 修剪每行 | 在其他清理步驟執行前,先去除每行開頭與結尾的 Unicode 空白字元;不會壓縮訊息內部的空格。 |
| 移除空行 | 移除在修剪後變成空白的行;若未啟用修剪,僅含空格的行不會被視為空行。 |
| 移除完全重複行 | 保留與先前行逐位元組完全相同的那一行的第一個複本;Apple 與 apple 不視為重複。 |
因為排序是穩定的 — 等價的行會保留其原始相對順序,而非被反轉 — 兩則時間戳記相同的訊息會維持它們在匯出檔中出現的順序。這個穩定性是透過瀏覽器的 Array.prototype.sort 行為,搭配作為平手決勝依據的每行索引來實作。比較本身則透過 英文 Intl.Collator,這是語言學式的定序,而非原始 Unicode 碼位排序,因此訊息本文中的重音字元會以英文使用者預期的方式進行比較。
逐行排序在真實對話中無法再幫上忙的界線
一旦每則訊息各自成行、且前面帶有時間戳記,逐行排序工具就是正確的工具。但在兩種特定情況下它是錯誤的工具,了解這個界線可以避免產生損壞的輸出。
第一個界線是 CSV。CSV 的一個列內可以在欄位中包含以引號括住的換行字元,而如果你排序 CSV 的實體行,以引號括住的多行儲存格會被拆開,各欄位也就不再對齊。如果你的匯出是 CSV — 許多以 Mac 為基礎的萃取工具預設採用該格式 — 請改用具備格式感知的表格工具,而非純粹的逐行排序器。
第二個界線是日期本身的解析。自然數字順序會以數值方式比較數字序列,因此 2024-03-02 的確會排在 2024-03-10 之前,但它並不會把這些字串解析為行事曆日期。它無法辨識月份名稱、時區、星期標籤,或帶有 AM/PM 的 12 小時制時鐘,也不會理解 2024-02-29 只在閏年才會出現在 2024-03-01 之前。如果你的匯出使用任何非 ISO 格式,請在貼上之前將時間戳記統一為 ISO 形式的字串,例如 YYYY-MM-DD HH:MM,以便讓字元順序對應到時間順序。這個前置處理能讓排序保持可預測,而工具穩定且具決定性的行為則讓工作流程的其餘部分保持可重現。
至於其他情況 — 每則訊息單獨一行、開頭為 ISO 形式的日期、沒有內嵌的換行字元 — Text Sorter 會在你的瀏覽器中重新排列對話,在任何以相同選項重新執行時都會回傳相同的順序,並讓你將結果下載為 UTF-8 文字檔,過程中不會將任何一行傳送至遠端伺服器。如果你希望在貼上前為輸出加上前綴,在 iPhone Safari 中為每行加上前綴指南涵蓋了該工作流程在 iPhone 端的做法。