Datetime.ParseExact yöntemi ile oynuyordum ve bir IFormatProvider istiyor ...
Null girerek çalışır, ancak tam olarak ne yapar?
Datetime.ParseExact yöntemi ile oynuyordum ve bir IFormatProvider istiyor ...
Null girerek çalışır, ancak tam olarak ne yapar?
Yanıtlar:
Ian Boyd'un cevabına ek olarak:
Ayrıca CultureInfo
bu arayüzü uygular ve sizin durumunuzda kullanılabilir. Örneğin, bir Fransız tarih dizesini ayrıştırabilirsiniz; kullanabilirsin
var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);
DateTime.ParseExact(string, string, IFormatProvider)
yerine, inanıyorum - örneğin: DateTime.ParseExact("20160409 111559","yyyyMMdd HHmmss",CultureInfo.CurrentCulture)
DateTime dt = DateTime.Parse(yourDateInputString, ci);
Lütfen cevabınızı revize edin.
IFormatProvider
Arayüzü normal bir tarafından sizin için uygulanan CultureInfo
sınıf, örneğin:
CultureInfo.CurrentCulture
CultureInfo.CurrentUICulture
CultureInfo.InvariantCulture
CultureInfo.CreateSpecificCulture("de-CA") //German (Canada)
Arabirim, bir işlevin bir kültürden kültüre özgü bir dizi veri alması için bir ağ geçididir. IFormatProvider
Sorgulanabilecek yaygın olarak bulunan iki kültür nesnesi şunlardır:
Normalde çalışma şekli, IFormatProvider
size bir DateTimeFormatInfo
nesne vermenizi istemenizdir :
DateTimeFormatInfo format;
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
if (format != null)
DoStuffWithDatesOrTimes(format);
Ayrıca, herhangi bir IFormatProvider
arayüzün büyük olasılıkla inen CultureInfo
veya alçalan bir sınıf tarafından uygulandığına dair içeriden bilgi vardır DateTimeFormatInfo
, böylece arayüzü doğrudan çevirebilirsiniz:
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üm bu sıkı çalışmalar sizin için çoktan yazıldı:
Bir'den bir almak DateTimeFormatInfo
içinIFormatProvider
:
DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);
Bir'den bir almak NumberFormatInfo
içinIFormatProvider
:
NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);
Değeri, IFormatProvider
kendi kültür nesnelerinizi yaratmanızdır. Onlar uyguladıkları IFormatProvider
ve istenen nesneleri geri verdikleri sürece, yerleşik kültürleri atlayabilirsiniz.
Ayrıca IFormatProvider
, rastgele kültür nesnelerini iletmenin bir yolu olarak da kullanabilirsiniz - IFormatProvider
. Örneğin, farklı kültürlerdeki tanrının adı
Bu, özel LordsNameFormatInfo
sınıfınızın bir içinde IFormatProvider
sürmesini sağlar ve deyimi koruyabilirsiniz.
Gerçekte asla kendi GetFormat
yönteminizi aramanıza gerek kalmayacak IFormatProvider
.
Ne zaman ihtiyacınız IFormatProvider
olursa bir CultureInfo
nesneyi iletebilirsiniz :
DateTime.Now.ToString(CultureInfo.CurrentCulture);
endTime.ToString(CultureInfo.InvariantCulture);
transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc"));
Not : Herhangi bir kod kamu malı olarak yayınlanır. Herhangi bir atıf gerekmez.
IFormatProvider
Bunu yapmanın doğru yolu olmadığından null geçmek . Kullanıcının bilgisayarında özel bir tarih / saat biçimi varsa, ayrıştırma ve dizeye dönüştürme konusunda sorunlar yaşarsınız. Birisinin dizeye dönüştürürken IFormatProvider olarak null geçtiği bir hatayı düzelttim.
Bunun yerine kullanmalısın CultureInfo.InvariantCulture
Yanlış:
string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", null);
Doğru:
string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", CultureInfo.InvariantCulture);
CultureInfo.InvariantCulture
Bunun yerine kullanmamız gereken herhangi bir sebep var mı CultureInfo.CurrentCulture
?
null
varsayılan olarak olacaktır CultureInfo.CurrentCulture
. Referans kaynağındaki çağrıya bakın , eğer çağrı zincirini takip ederseniz, null sonunda DateTimeFormatInfo.CurrentInfo
hangi CultureInfo.CurrentCulture
çıktılara eşdeğer olan ile değiştirilir .
IFormatProvider , söz konusu yönteme kültür bilgisi sağlar. DateTimeFormatInfo , IFormatProvider'ı uygular ve tarih / saatinizin görüntülenmesini istediğiniz formatı belirlemenize olanak tanır. Örnekler ilgili MSDN sayfalarında bulunabilir.
Burada http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx görebilirsiniz
Oradaki açıklamalara ve örnek bölümüne bakın.
IFormatProvider
kullanılmıyor IFormatProvider
.
API için http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx kontrol edin .
by MSDN
.NET Framework, sayısal ve tarih ve saat değerlerini biçimlendirmede veya ayrıştırmada kullanılan kültüre özgü bilgileri sağlamak için aşağıdaki önceden tanımlanmış üç IFormatProvider uygulamasını içerir :
NumberFormatInfo
Belirli bir kültür için, para birimi gibi biçim numaraları, binlerce ayırıcı ve ondalık ayırıcı semboller için kullanılan bilgiler sağlar sınıfı. Bir NumberFormatInfo
nesne tarafından tanınan ve sayısal biçimlendirme işlemlerinde kullanılan önceden tanımlanmış biçim dizeleri hakkında bilgi için bkz. Standart Sayısal Biçim Dizeleri ve Özel Sayısal Biçim Dizeleri.DateTimeFormatInfo
Örneğin belirli bir kültür veya bir buluşmamız yıl, ay ve gün bileşenlerinin düzeni ve biçimi için tarih ve saat ayırıcı sembolleri olarak biçim tarihleri ve saatleri, için kullanılan bilgiler sağlar sınıfı. Bir DateTimeFormatInfo
nesne tarafından tanınan ve sayısal biçimlendirme işlemlerinde kullanılan önceden tanımlanmış biçim dizeleri hakkında bilgi için bkz. Standart Tarih ve Saat Biçimi Dizeleri ve Özel Tarih ve Saat Biçimi Dizeleri.CultureInfo
Belirli bir kültürü temsil sınıfı. Onun GetFormat
yöntemi bir kültür-özgü döndüren NumberFormatInfo
veya DateTimeFormatInfo
olmamasına bağlı olarak, nesneyi CultureInfo
nesne numaraları veya tarih ve saatleri içeren bir biçimlendirme veya ayrıştırma işleminde kullanılır..NET Framework ayrıca özel biçimlendirmeyi de destekler. Bu genellikle hem IFormatProvider hem de ICustomFormatter uygulayan bir formatlama sınıfının oluşturulmasını içerir. Daha sonra bu sınıfın bir örneği String.Format(IFormatProvider, String, Object[])
,.
DateTimeFormatInfo sınıfının uyguladığı bu arayüz, bu yüzden size DateTime dizeleri biçimlendirme kontrol etmenizi sağlar.