fputcsv函數將數據以逗號分隔的形式輸出到文件中。由於CSV 文件本質上是一個純文本格式,所有字段都以字符串的形式保存。因此,如果我們直接將PHP 的DateTime對像或者包含日期時間的字段寫入CSV 文件,可能會遇到以下問題:
格式不一致:不同系統或程序讀取CSV 文件時,可能無法正確識別日期時間字段的格式。
數據丟失或錯誤:某些日期時間格式可能在保存時會丟失精度,尤其是包含時區信息的日期。
為了避免這些問題,必須在寫入前對日期時間字段進行合理的格式化。
在使用fputcsv寫入包含日期時間的字段時,最常用的做法是使用DateTime對象的format方法,將日期時間轉化為一致的字符串格式。例如,ISO 8601 格式( Ymd H:i:s )通常是一個通用且兼容性強的選擇。
假設我們有一個DateTime對象,想要將它寫入CSV 文件,可以使用如下代碼:
<span><span><span class="hljs-variable">$date</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">DateTime</span></span><span>();
</span><span><span class="hljs-variable">$formattedDate</span></span><span> = </span><span><span class="hljs-variable">$date</span></span><span>-></span><span><span class="hljs-title function_ invoke__">format</span></span><span>(</span><span><span class="hljs-string">'Y-m-d H:i:s'</span></span><span>); </span><span><span class="hljs-comment">// 格式化為 '2025-07-27 14:45:00'</span></span><span>
</span></span>
這會將當前日期時間格式化為YYYY-MM-DD HH:MM:SS的字符串。
如果日期時間字段是字符串類型(如從數據庫中獲取),我們同樣可以使用DateTime::createFromFormat方法來轉換並格式化日期。例如:
<span><span><span class="hljs-variable">$dateString</span></span><span> = </span><span><span class="hljs-string">'2025-07-27 14:45:00'</span></span><span>;
</span><span><span class="hljs-variable">$date</span></span><span> = </span><span><span class="hljs-title class_">DateTime</span></span><span>::</span><span><span class="hljs-title function_ invoke__">createFromFormat</span></span><span>(</span><span><span class="hljs-string">'Y-m-d H:i:s'</span></span><span>, </span><span><span class="hljs-variable">$dateString</span></span><span>);
</span><span><span class="hljs-variable">$formattedDate</span></span><span> = </span><span><span class="hljs-variable">$date</span></span><span>-></span><span><span class="hljs-title function_ invoke__">format</span></span><span>(</span><span><span class="hljs-string">'Y-m-d H:i:s'</span></span><span>);
</span></span>
接下來,我們來看如何在使用fputcsv時,將格式化後的日期時間寫入CSV 文件。假設我們有一個包含多個字段的數組,其中一個字段是日期時間字段。
<span><span><span class="hljs-variable">$data</span></span><span> = [
[</span><span><span class="hljs-string">'Name'</span></span><span>, </span><span><span class="hljs-string">'Date'</span></span><span>, </span><span><span class="hljs-string">'Amount'</span></span><span>],
[</span><span><span class="hljs-string">'John Doe'</span></span><span>, </span><span><span class="hljs-string">'2025-07-27 14:45:00'</span></span><span>, </span><span><span class="hljs-number">1000</span></span><span>],
[</span><span><span class="hljs-string">'Jane Smith'</span></span><span>, </span><span><span class="hljs-string">'2025-07-28 09:30:00'</span></span><span>, </span><span><span class="hljs-number">1500</span></span><span>]
];
</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'data.csv'</span></span><span>, </span><span><span class="hljs-string">'w'</span></span><span>);
</span><span><span class="hljs-comment">// 寫入標題行</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fputcsv</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>, </span><span><span class="hljs-variable">$data</span></span><span>[</span><span><span class="hljs-number">0</span></span><span>]);
</span><span><span class="hljs-comment">// 寫入數據行,並確保日期格式化正確</span></span><span>
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$data</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$row</span></span><span>) {
</span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-number">1</span></span><span>] = (</span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">DateTime</span></span><span>(</span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-number">1</span></span><span>]))-></span><span><span class="hljs-title function_ invoke__">format</span></span><span>(</span><span><span class="hljs-string">'Y-m-d H:i:s'</span></span><span>); </span><span><span class="hljs-comment">// 格式化日期字段</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fputcsv</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>, </span><span><span class="hljs-variable">$row</span></span><span>);
}
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span></span>
在這個例子中,第二列( Date )是一個日期時間字段。在寫入文件之前,我們使用DateTime對象的format方法將日期格式化為Ymd H:i:s形式。這樣,無論在哪個系統中讀取CSV 文件,日期都會保持一致的格式,減少了格式不一致的問題。
時區問題:如果你的日期時間包含時區信息,建議使用ISO 8601 格式( Ymd\TH:i:sP ),其中P會輸出時區信息。例如: 2025-07-27T14:45:00+00:00 。確保在格式化時正確處理時區,避免時區轉換帶來的問題。
CSV 文件的編碼:確保保存CSV 文件時使用正確的編碼格式。推薦使用UTF-8 編碼,以確保特殊字符(如中文)能被正確保存。
日期時間的有效性檢查:在格式化之前,最好驗證日期時間字符串的有效性,避免無效的日期(例如, 2025-02-30 )導致格式化錯誤。