ฉันกำลังเล่นกับเมธอด 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.CurrentCulture
CultureInfo.CurrentUICulture
CultureInfo.InvariantCulture
CultureInfo.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 ของคุณ