Có phải vì một số vấn đề định dạng văn hóa?
Đúng. Người dùng của bạn phải ở trong một nền văn hóa nơi dấu phân cách thời gian là một dấu chấm. Cả ":" và "/" đều được diễn giải theo cách nhạy cảm về văn hóa theo các định dạng ngày và giờ tùy chỉnh .
Làm thế nào tôi có thể chắc chắn rằng chuỗi kết quả được phân định bằng dấu hai chấm thay vì dấu chấm?
Tôi đề nghị chỉ định CultureInfo.InvariantCulture
:
string text = dateTime.ToString("MM/dd/yyyy HH:mm:ss.fff",
CultureInfo.InvariantCulture);
Ngoài ra, bạn chỉ có thể trích dẫn dấu phân cách thời gian và ngày:
string text = dateTime.ToString("MM'/'dd'/'yyyy HH':'mm':'ss.fff");
... nhưng điều đó sẽ mang lại cho bạn kết quả "thú vị" mà bạn có thể không mong đợi nếu bạn khiến người dùng chạy trong một nền văn hóa nơi hệ thống lịch mặc định không phải là lịch Gregorian. Ví dụ: lấy mã sau:
using System;
using System.Globalization;
using System.Threading;
class Test
{
static void Main()
{
DateTime now = DateTime.Now;
CultureInfo culture = new CultureInfo("ar-SA"); // Saudi Arabia
Thread.CurrentThread.CurrentCulture = culture;
Console.WriteLine(now.ToString("yyyy-MM-ddTHH:mm:ss.fff"));
}
}
Điều đó tạo ra sản lượng (vào ngày 18 tháng 9 năm 2013) của:
11/12/1434 15:04:31.750
Tôi đoán là dịch vụ web của bạn sẽ ngạc nhiên về điều đó!
Tôi thực sự đề nghị không chỉ sử dụng văn hóa bất biến, mà còn thay đổi sang định dạng ngày ISO-8601:
string text = dateTime.ToString("yyyy-MM-ddTHH:mm:ss.fff");
Đây là một định dạng được chấp nhận toàn cầu hơn - nó cũng có thể sắp xếp được, và làm cho thứ tự ngày và ngày trở nên rõ ràng. (Trong đó 06/07/2013 có thể được hiểu là ngày 7 tháng 6 hoặc ngày 6 tháng 7 tùy thuộc vào văn hóa của người đọc.)