ฉันกำลังเล่นกับเมธอด Datetime.ParseExact และมันต้องการ IFormatProvider ...
มันใช้งานได้ในการป้อนค่า null แต่มันทำอะไรกันแน่?
ฉันกำลังเล่นกับเมธอด Datetime.ParseExact และมันต้องการ IFormatProvider ...
มันใช้งานได้ในการป้อนค่า null แต่มันทำอะไรกันแน่?
คำตอบ:
ในการยอมรับคำตอบของ Ian Boyd:
นอกจากนี้ยังCultureInfoดำเนินการติดต่อนี้และสามารถนำมาใช้ในกรณีของคุณ คุณจึงสามารถแยกวิเคราะห์สตริงวันที่ภาษาฝรั่งเศสได้เช่น คุณสามารถใช้
var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);
DateTime.ParseExact(string, string, IFormatProvider)แทนฉันเชื่อว่า - เช่น: DateTime.ParseExact("20160409 111559","yyyyMMdd HHmmss",CultureInfo.CurrentCulture)
DateTime dt = DateTime.Parse(yourDateInputString, ci);โปรดแก้ไขคำตอบของคุณ
โดยIFormatProviderปกติอินเทอร์เฟซจะถูกใช้งานสำหรับคุณโดยCultureInfoคลาสเช่น:
CultureInfo.CurrentCultureCultureInfo.CurrentUICultureCultureInfo.InvariantCultureCultureInfo.CreateSpecificCulture("de-CA") //German (Canada)อินเทอร์เฟซเป็นเกตเวย์สำหรับฟังก์ชันเพื่อรับชุดข้อมูลเฉพาะวัฒนธรรมจากวัฒนธรรม วัตถุทางวัฒนธรรมที่มีอยู่ทั่วไปสองรายการที่IFormatProviderสามารถสอบถามได้คือ:
วิธีการทำงานตามปกติคือคุณขอIFormatProviderให้คุณมอบDateTimeFormatInfoวัตถุ:
DateTimeFormatInfo format;
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
if (format != null)
DoStuffWithDatesOrTimes(format);
นอกจากนี้ยังมีความรู้ภายในว่าIFormatProviderอินเทอร์เฟซใด ๆน่าจะถูกนำไปใช้โดยคลาสที่สืบเชื้อสายมาจากCultureInfoหรือสืบเชื้อสายมาDateTimeFormatInfoดังนั้นคุณสามารถส่งอินเทอร์เฟซได้โดยตรง:
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);
งานหนักทั้งหมดนั้นได้เขียนไว้สำหรับคุณแล้ว:
ในการรับDateTimeFormatInfoจากIFormatProvider :
DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);
ในการรับNumberFormatInfoจากIFormatProvider :
NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);
คุณค่าIFormatProviderคือคุณสร้างวัตถุทางวัฒนธรรมของคุณเอง ตราบเท่าที่พวกเขานำไปใช้IFormatProviderและส่งคืนวัตถุที่พวกเขาขอคุณสามารถข้ามวัฒนธรรมที่มีอยู่แล้วได้
คุณยังสามารถใช้IFormatProviderเพื่อส่งผ่านวัตถุทางวัฒนธรรมโดยพลการ - ผ่านไฟล์IFormatProvider. เช่นชื่อของเทพเจ้าในวัฒนธรรมที่แตกต่างกัน
สิ่งนี้ช่วยให้LordsNameFormatInfoชั้นเรียนที่กำหนดเองของคุณขับไปใน an IFormatProviderและคุณสามารถรักษาสำนวน
ในความเป็นจริงคุณไม่จำเป็นต้องเรียกGetFormatวิธีการของIFormatProviderตัวเอง
เมื่อใดก็ตามที่คุณต้องการIFormatProviderคุณสามารถส่งผ่านCultureInfoวัตถุ:
DateTime.Now.ToString(CultureInfo.CurrentCulture);
endTime.ToString(CultureInfo.InvariantCulture);
transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc"));
หมายเหตุ : รหัสใด ๆ ถูกเผยแพร่สู่สาธารณสมบัติ ไม่จำเป็นต้องแสดงที่มา
การส่งค่า null เนื่องจากIFormatProviderไม่ใช่วิธีที่ถูกต้องในการทำเช่นนี้ หากผู้ใช้มีรูปแบบวันที่ / เวลาที่กำหนดเองบนพีซีคุณจะมีปัญหาในการแยกวิเคราะห์และแปลงเป็นสตริง ฉันเพิ่งแก้ไขข้อผิดพลาดที่มีคนส่งค่า null เป็น IFormatProvider เมื่อแปลงเป็นสตริง
แต่คุณควรใช้ CultureInfo.InvariantCulture
ไม่ถูกต้อง:
string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", null);
แก้ไข:
string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", CultureInfo.InvariantCulture);
CultureInfo.InvariantCultureแทนCultureInfo.CurrentCulture?
nullจะเริ่มต้นเป็นCultureInfo.CurrentCulture. ดูการโทรในแหล่งอ้างอิงหากคุณติดตามสายการโทรไปพร้อมกันในที่สุด null จะถูกแทนที่ด้วยDateTimeFormatInfo.CurrentInfoซึ่งเทียบเท่ากับCultureInfo.CurrentCultureเอาต์พุตใด
IFormatProviderให้ข้อมูลวัฒนธรรมแก่วิธีการที่เป็นปัญหา DateTimeFormatInfoใช้ IFormatProvider และอนุญาตให้คุณระบุรูปแบบที่คุณต้องการให้แสดงวันที่ / เวลาตัวอย่างสามารถพบได้ในเพจ MSDN ที่เกี่ยวข้อง
คุณสามารถดูได้ที่นี่http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx
ดูข้อสังเกตและส่วนตัวอย่างที่นั่น
IFormatProvider IFormatProvider
ตรวจสอบhttp://msdn.microsoft.com/en-us/library/system.iformatprovider.aspxสำหรับ API
โดยMSDN
.NET Framework รวมการใช้งาน IFormatProvider ที่กำหนดไว้ล่วงหน้าสามแบบต่อไปนี้เพื่อให้ข้อมูลเฉพาะวัฒนธรรมที่ใช้ในการจัดรูปแบบหรือแยกวิเคราะห์ค่าตัวเลขและวันที่และเวลา:
NumberFormatInfoระดับซึ่งให้ข้อมูลที่ใช้ในการตัวเลขรูปแบบต่างๆเช่นสกุลเงินที่คั่นหลักพันและสัญลักษณ์คั่นทศนิยมวัฒนธรรมโดยเฉพาะอย่างยิ่ง สำหรับข้อมูลเกี่ยวกับสตริงรูปแบบที่กำหนดไว้ล่วงหน้าที่NumberFormatInfoอ็อบเจ็กต์รู้จักและใช้ในการดำเนินการจัดรูปแบบตัวเลขโปรดดูสตริงรูปแบบตัวเลขมาตรฐานและสตริงรูปแบบตัวเลขที่กำหนดเองDateTimeFormatInfoระดับซึ่งให้ข้อมูลที่ใช้ในการจัดรูปแบบวันที่และเวลาเช่นวันและเวลาที่คั่นสัญลักษณ์สำหรับวัฒนธรรมโดยเฉพาะหรือการสั่งซื้อและรูปแบบของวันปีเดือนวันและส่วนประกอบ สำหรับข้อมูลเกี่ยวกับสตริงรูปแบบที่กำหนดไว้ล่วงหน้าที่DateTimeFormatInfoอ็อบเจ็กต์รู้จักและใช้ในการดำเนินการจัดรูปแบบตัวเลขโปรดดูสตริงรูปแบบวันที่และเวลามาตรฐานและสตริงรูปแบบวันที่และเวลาที่กำหนดเองCultureInfoระดับซึ่งหมายถึงวัฒนธรรมโดยเฉพาะอย่างยิ่ง ใช้GetFormatวิธีการส่งกลับวัฒนธรรมที่เฉพาะเจาะจงNumberFormatInfoหรือDateTimeFormatInfoวัตถุขึ้นอยู่กับว่าCultureInfoวัตถุที่ถูกนำมาใช้ในการดำเนินการจัดรูปแบบหรือการแยกวิเคราะห์ที่เกี่ยวข้องกับตัวเลขหรือวันที่และเวลา.NET Framework ยังสนับสนุนการจัดรูปแบบแบบกำหนดเอง โดยทั่วไปจะเกี่ยวข้องกับการสร้างคลาสการจัดรูปแบบที่ใช้ทั้ง IFormatProvider และ ICustomFormatter String.Format(IFormatProvider, String, Object[])อินสแตนซ์ของคลาสนี้ถูกส่งผ่านไปแล้วเป็นพารามิเตอร์กับวิธีการที่มีประสิทธิภาพการดำเนินงานการจัดรูปแบบที่กำหนดเองเช่น
DateTimeFormatInfoการดำเนินการระดับอินเตอร์เฟซนี้เพื่อที่จะช่วยให้คุณควบคุมการจัดรูปแบบของสตริง DateTime ของคุณ