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 CultureInfobu 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.
IFormatProviderArayüzü normal bir tarafından sizin için uygulanan CultureInfosınıf, örneğin:
CultureInfo.CurrentCultureCultureInfo.CurrentUICultureCultureInfo.InvariantCultureCultureInfo.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. IFormatProviderSorgulanabilecek yaygın olarak bulunan iki kültür nesnesi şunlardır:
Normalde çalışma şekli, IFormatProvidersize bir DateTimeFormatInfonesne vermenizi istemenizdir :
DateTimeFormatInfo format;
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
if (format != null)
DoStuffWithDatesOrTimes(format);
Ayrıca, herhangi bir IFormatProviderarayüzün büyük olasılıkla inen CultureInfoveya 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 DateTimeFormatInfoiçinIFormatProvider :
DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);
Bir'den bir almak NumberFormatInfoiçinIFormatProvider :
NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);
Değeri, IFormatProviderkendi kültür nesnelerinizi yaratmanızdır. Onlar uyguladıkları IFormatProviderve 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 LordsNameFormatInfosınıfınızın bir içinde IFormatProvidersürmesini sağlar ve deyimi koruyabilirsiniz.
Gerçekte asla kendi GetFormatyönteminizi aramanıza gerek kalmayacak IFormatProvider.
Ne zaman ihtiyacınız IFormatProviderolursa bir CultureInfonesneyi 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.
IFormatProviderBunu 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.InvariantCultureBunun yerine kullanmamız gereken herhangi bir sebep var mı CultureInfo.CurrentCulture?
nullvarsayılan olarak olacaktır CultureInfo.CurrentCulture. Referans kaynağındaki çağrıya bakın , eğer çağrı zincirini takip ederseniz, null sonunda DateTimeFormatInfo.CurrentInfohangi 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.
IFormatProviderkullanı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 :
NumberFormatInfoBelirli 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 NumberFormatInfonesne 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 DateTimeFormatInfonesne 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.CultureInfoBelirli bir kültürü temsil sınıfı. Onun GetFormatyöntemi bir kültür-özgü döndüren NumberFormatInfoveya DateTimeFormatInfoolmamasına bağlı olarak, nesneyi CultureInfonesne 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.