Tôi đã thử với phương thức Datetime.ParseExact và nó muốn một IFormatProvider ...
Nó hoạt động khi nhập null, nhưng chính xác thì nó làm gì?
Tôi đã thử với phương thức Datetime.ParseExact và nó muốn một IFormatProvider ...
Nó hoạt động khi nhập null, nhưng chính xác thì nó làm gì?
Câu trả lời:
Để bổ sung cho câu trả lời của Ian Boyd:
Cũng CultureInfo
thực hiện giao diện này và có thể được sử dụng trong trường hợp của bạn. Vì vậy, bạn có thể phân tích cú pháp một chuỗi ngày tiếng Pháp chẳng hạn; bạn đã có thể sử dụng
var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);
DateTime.ParseExact(string, string, IFormatProvider)
thay vào đó, tôi tin rằng - như vậy: DateTime.ParseExact("20160409 111559","yyyyMMdd HHmmss",CultureInfo.CurrentCulture)
DateTime dt = DateTime.Parse(yourDateInputString, ci);
Vui lòng sửa lại câu trả lời của bạn.
Các IFormatProvider
giao diện thường được thực hiện cho bạn bằng một CultureInfo
lớp, ví dụ như:
CultureInfo.CurrentCulture
CultureInfo.CurrentUICulture
CultureInfo.InvariantCulture
CultureInfo.CreateSpecificCulture("de-CA") //German (Canada)
Giao diện là một cửa ngõ cho một chức năng để lấy một bộ dữ liệu dành riêng cho từng nền văn hóa từ một nền văn hóa. Hai đối tượng nuôi cấy phổ biến có sẵn mà một IFormatProvider
có thể được truy vấn là:
Cách nó hoạt động bình thường là bạn yêu cầu IFormatProvider
cung cấp cho bạn một DateTimeFormatInfo
đối tượng:
DateTimeFormatInfo format;
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
if (format != null)
DoStuffWithDatesOrTimes(format);
Ngoài ra còn có kiến thức bên trong rằng bất kỳ IFormatProvider
giao diện nào cũng có khả năng được thực hiện bởi một lớp giảm dần CultureInfo
hoặc giảm dần DateTimeFormatInfo
, vì vậy bạn có thể truyền trực tiếp giao diện:
CultureInfo info = provider as CultureInfo;
if (info != null)
format = info.DateTimeInfo;
else
{
DateTimeFormatInfo dtfi = provider as DateTimeFormatInfo;
if (dtfi != null)
format = dtfi;
else
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
}
if (format != null)
DoStuffWithDatesOrTimes(format);
Tất cả công việc khó khăn đó đã được viết cho bạn:
Để nhận được DateTimeFormatInfo
từ mộtIFormatProvider
:
DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);
Để nhận được NumberFormatInfo
từ mộtIFormatProvider
:
NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);
Giá trị của IFormatProvider
nó là bạn tạo ra các đối tượng văn hóa của riêng bạn. Miễn là họ triển khai IFormatProvider
và trả lại các đối tượng mà họ yêu cầu, bạn có thể bỏ qua các nền văn hóa tích hợp sẵn.
Bạn cũng có thể sử dụng IFormatProvider
cho một cách truyền các đối tượng văn hóa tùy ý - thông qua IFormatProvider
. Ví dụ: tên của thần trong các nền văn hóa khác nhau
Điều này cho phép LordsNameFormatInfo
lớp học tùy chỉnh của bạn đi cùng bên trongIFormatProvider
và bạn có thể bảo tồn thành ngữ.
Trong thực tế, bạn sẽ không bao giờ cần gọi GetFormat
phương thức củaIFormatProvider
chính mình.
Bất cứ khi nào bạn cần, IFormatProvider
bạn có thể chuyển một CultureInfo
đối tượng:
DateTime.Now.ToString(CultureInfo.CurrentCulture);
endTime.ToString(CultureInfo.InvariantCulture);
transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc"));
Lưu ý : Bất kỳ mã nào được phát hành vào miền công cộng. Không cần ghi công.
Truyền null IFormatProvider
không phải là cách chính xác để thực hiện việc này. Nếu người dùng có định dạng ngày / giờ tùy chỉnh trên PC của họ, bạn sẽ gặp vấn đề khi phân tích cú pháp và chuyển đổi thành chuỗi. Tôi vừa sửa một lỗi trong đó ai đó đã chuyển null làm IFormatProvider khi chuyển đổi thành chuỗi.
Thay vào đó, bạn nên sử dụng CultureInfo.InvariantCulture
Sai lầm:
string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", null);
Chính xác:
string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", CultureInfo.InvariantCulture);
CultureInfo.InvariantCulture
thay vì CultureInfo.CurrentCulture
?
null
sẽ mặc định thành CultureInfo.CurrentCulture
. Xem lệnh gọi trong nguồn tham chiếu , nếu bạn tuân theo chuỗi lệnh gọi, giá trị rỗng cuối cùng sẽ được thay thế bằng giá trị DateTimeFormatInfo.CurrentInfo
tương đương với CultureInfo.CurrentCulture
kết quả đầu ra.
IFormatProvider cung cấp thông tin văn hóa cho phương pháp được đề cập. DateTimeFormatInfo triển khai IFormatProvider và cho phép bạn chỉ định định dạng bạn muốn hiển thị ngày / giờ của mình. Bạn có thể tìm thấy các ví dụ trên các trang MSDN liên quan.
Bạn có thể xem tại đây http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx
Xem phần nhận xét và ví dụ ở đó.
IFormatProvider
không sử dụng IFormatProvider
.
Kiểm tra http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx để biết API.
Bởi MSDN
.NET Framework bao gồm ba triển khai IFormatProvider được xác định trước sau đây để cung cấp thông tin về văn hóa cụ thể được sử dụng trong định dạng hoặc phân tích cú pháp các giá trị số và ngày và giờ:
NumberFormatInfo
lớp, cung cấp thông tin được sử dụng để định dạng số, chẳng hạn như tiền tệ, hàng ngàn phân cách, và các ký hiệu thập phân tách cho một nền văn hóa cụ thể. Để biết thông tin về các chuỗi định dạng xác định trước được một NumberFormatInfo
đối tượng nhận dạng và sử dụng trong các thao tác định dạng số, hãy xem Chuỗi định dạng số chuẩn và Chuỗi định dạng số tùy chỉnh.DateTimeFormatInfo
lớp, cung cấp thông tin được sử dụng để định dạng ngày tháng và thời gian, ví dụ như ngày tháng và thời gian ký tự phân cách cho một nền văn hóa cụ thể hoặc trình tự, định dạng của các thành phần năm, tháng và ngày một ngày. Để biết thông tin về các chuỗi định dạng được xác định trước được công nhận bởiDateTimeFormatInfo
đối tượng và sử dụng trong các thao tác định dạng số, hãy xem Chuỗi định dạng ngày và giờ chuẩn và Chuỗi định dạng ngày và giờ tùy chỉnh.CultureInfo
lớp, đại diện cho một nền văn hóa cụ thể. GetFormat
Phương thức của nó trả về một đối tượng NumberFormatInfo
hoặc một nền văn hóa cụ thể DateTimeFormatInfo
, tùy thuộc vào việc CultureInfo
đối tượng đó được sử dụng trong thao tác định dạng hoặc phân tích cú pháp liên quan đến số hoặc ngày và giờ..NET Framework cũng hỗ trợ định dạng tùy chỉnh. Điều này thường liên quan đến việc tạo ra một lớp định dạng triển khai cả IFormatProvider và ICustomFormatter. Một thể hiện của lớp này sau đó được chuyển dưới dạng tham số cho một phương thức thực hiện thao tác định dạng tùy chỉnh, chẳng hạn như String.Format(IFormatProvider, String, Object[])
.
Lớp DateTimeFormatInfo triển khai giao diện này, vì vậy nó cho phép bạn kiểm soát việc định dạng các chuỗi DateTime của mình.