DateTime.ToString ("AA / gg / yyyy HH: mm: ss.fff") "09/14/2013 07.20.31.371" gibi bir şeyle sonuçlandı


131

Geçerli saati bir web hizmetine gönderecek bir WP8 uygulamam var.

Tarih saat dizesini çağırarak alıyorum

DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff")

Çoğu kullanıcı için harika çalışıyor ve bana gibi doğru dizeyi veriyor "09/10/2013 04:04:31.415". Ancak bazı kullanıcılar için ortaya çıkan dize, "09/14/2013 07.20.31.371"web hizmetimde soruna neden olan bir şeydir .

Bazı kültür formatı sorunları yüzünden mi? Sonuç dizesinin nokta yerine iki nokta üst üste ile ayrıldığından nasıl emin olabilirim?


2
tek fark iki nokta üst üste ve nokta.
Eldorado

Yanıtlar:


244

Bazı kültür formatı sorunları yüzünden mi?

Evet. Kullanıcınız, zaman ayırıcısının nokta olduğu bir kültürde olmalıdır. Hem ":" hem de "/", özel tarih ve saat biçimlerinde kültüre duyarlı bir şekilde yorumlanır .

Sonuç dizesinin nokta yerine iki nokta üst üste ile ayrıldığından nasıl emin olabilirim?

Şunları belirtmenizi öneririm CultureInfo.InvariantCulture:

string text = dateTime.ToString("MM/dd/yyyy HH:mm:ss.fff",
                                CultureInfo.InvariantCulture);

Alternatif olarak, saat ve tarih ayırıcılarını alıntı yapabilirsiniz :

string text = dateTime.ToString("MM'/'dd'/'yyyy HH':'mm':'ss.fff");

... ancak bu size, varsayılan takvim sisteminin Gregoryen takvimi olmadığı bir kültürde çalışan kullanıcıları alırsanız muhtemelen beklemeyeceğiniz "ilginç" sonuçlar verecektir. Örneğin, aşağıdaki kodu alın:

using System;
using System.Globalization;
using System.Threading;

class Test
{
    static void Main()        
    {
        DateTime now = DateTime.Now;
        CultureInfo culture = new CultureInfo("ar-SA"); // Saudi Arabia
        Thread.CurrentThread.CurrentCulture = culture;
        Console.WriteLine(now.ToString("yyyy-MM-ddTHH:mm:ss.fff"));
    }
} 

Bu, (18 Eylül 2013'te) aşağıdakilerin çıktısını üretir:

11/12/1434 15:04:31.750

Tahminimce web servisiniz buna şaşıracak!

Aslında sadece değişmez kültürü kullanmayı değil, aynı zamanda bir ISO-8601 tarih biçimine geçmeyi de öneririm :

string text = dateTime.ToString("yyyy-MM-ddTHH:mm:ss.fff");

Bu, dünya çapında kabul gören bir biçimdir - aynı zamanda sıralanabilir ve ay ve gün düzenini açık hale getirir. (06/07/2013 ise okuyucunun kültürüne göre 7 Haziran veya 6 Temmuz olarak yorumlanabilir.)


teşekkürler Jon. Sonuç dizesinin tam olarak biçim dizesi gibi olacağını düşündüm. Önerinizi deneyeceğim.
Eldorado

3
Küçük bir husus. Belirli bir koddan bir CultureInfo nesnesini yüklerken, her zaman useUserOverrideparametreyi false olarak ayarlamanızı öneririm , aksi takdirde bazı kullanıcı ayarları kültür ayarlarını geçersiz kılabilir. Örneğin sizin durumunuzda yeniyi kullanmanızı öneririm CultureInfo("ar-SA", false).
Davide Icardi

@DavideIcardi: İlginç, teşekkürler - bu durumda Suudi Arabistan'ı kullanmanın amacı, özellikle değişmez kültürü kullanmanın neden muhtemelen doğru olduğunu söylemekti. Yine de gelecekteki gönderiler için bunu akılda tutacak.
Jon Skeet

7
Bu kapsamlı cevabın yarısında merak etmeye başladım: bu yine Jon olur mu? Evet.
Grimace of Despair

Html.TextBoxFor (x => x.Date, "{0: MM / gg / yyyy}") ile nasıl yönetilir?
VISHMAY

9

:özel bir anlamı vardır: zaman ayırıcıdır. ( Özel Tarih ve Saat Biçimi Dizeleri ).

\Kaçmak için kullanın :

DateTime.ToString(@"MM/dd/yyyy HH\:mm\:ss.fff")

Veya şunu kullanın CultureInfo.InvariantCulture:

DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff", CultureInfo.InvariantCulture)

İkincisiyle gitmenizi öneririm, çünkü /özel bir anlamı da vardır (bu, tarih ayırıcıdır ), bu yüzden onunla da sorun yaşayabilirsiniz.


2
Sorun olan sadece tarih ayırıcı değil - gerçek sayıları etkileyen kültür örneği için
cevabıma

1
\ ondan kaçmaz!
Shereef Marzouk

8

InvariantCulture'ı kullanabilirsiniz, çünkü kullanıcınız iki nokta üst üste yerine nokta kullanan bir kültürde olmalıdır:

DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff", CultureInfo.InvariantCulture);

7

Son zamanlarda Windows 10 ile bu soruna başka bir yönden rastladım, rastladım ve @ JonSkeet'in cevabını sorunumu çözmede çok yararlı buldum.

Ayrıca bir test formu ile daha fazla araştırma yaptım ve mevcut kültür çalışma zamanında "no"veya ayarlandığında "nb-NO"(Thread.CurrentThread.CurrentCulture = new CultureInfo("no"); ), ToString ( "HH yyyy-AA-gg: dd: ss") çağrısı Windows 7'de farklı yanıt verdi ve Windows 10. Windows 7 ve Windows 10'da HH.mm.ss'de beklediğim şeyi döndürdü!

Sanırım bu biraz korkutucu! Bir kültürün en azından herhangi bir Windows sürümünde bir kültür olduğuna inandığım için.


Buna gerçekten neyin sebep olduğunu bulmayı çok merak ediyorum.
Lauri Peltonen

2
Windows 10 konum belirleme Hatası olarak tanındı ve düzeltildi. Bu nedenle, istemci makinedeki bir Windows güncellemesi sorunu çözecektir. Bu blog gönderisinde daha fazla ayrıntı mevcuttur: heikniemi.net/hardcoded/2015/08/…
Håkon Seljåsen

Yukarıda bağlantı verdiğim Jouni Heikniemi blogu bozuk görünüyor. Sorunların giderildiği ilgili Windows güncellemeleri burada listelenmiştir: 2015-10-09: KB3093266 - Windows 10 KB3088956 - Windows Server 2012 R2 ve Windows 8.1 KB3088955 - Windows Server 2012 ve Windows 8 KB3088957 - Windows 7 SP1, Windows Server 2008 SP2 , Windows Server 2008 R2 SP1 ve Windows Vista SP2 Bu sefer archive.org olsa da bloga tekrar bağlanmaya çalışılıyor: web.archive.org/web/20161030193739/http://www.heikniemi.net/…
Håkon Seljåsen

4

String.Format'ı kullanabilirsiniz:

DateTime d = DateTime.Now;
string str = String.Format("{0:00}/{1:00}/{2:0000} {3:00}:{4:00}:{5:00}.{6:000}", d.Month, d.Day, d.Year, d.Hour, d.Minute, d.Second, d.Millisecond);
// I got this result: "02/23/2015 16:42:38.234"

0

Tarihi Dizeye Dönüştür

Ad alanı kullan

using System.Globalization;

kod

string date = DateTime.ParseExact(datetext.Text, "dd-MM-yyyy", CultureInfo.InstalledUICulture).ToString("yyyy-MM-dd");

Bu, bir tarihin bir dizeye nasıl dönüştürüleceği değildir. Ayrıştırma bunun tersidir!
Vincent Vancalbergh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.