Saya memiliki aplikasi WP8, yang akan mengirim waktu saat ini ke layanan web.
Saya mendapatkan string datetime dengan menelepon
DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff")
Untuk sebagian besar pengguna ini berfungsi dengan baik dan memberi saya string yang benar seperti "09/10/2013 04:04:31.415"
. Tetapi untuk beberapa pengguna string yang dihasilkan adalah sesuatu seperti "09/14/2013 07.20.31.371"
, yang menyebabkan masalah dalam layanan web saya.
Apakah karena beberapa masalah format budaya? Bagaimana saya bisa memastikan string hasil dibatasi oleh titik dua bukan titik?
c#
windows-phone-8
Eldorado
sumber
sumber
Jawaban:
Iya. Pengguna Anda harus dalam budaya di mana pemisah waktu adalah titik. Baik ":" dan "/" ditafsirkan dalam cara yang peka budaya dalam format tanggal dan waktu khusus .
Saya sarankan menentukan
CultureInfo.InvariantCulture
:Atau, Anda bisa mengutip pemisah waktu dan tanggal:
... tapi itu akan memberi Anda hasil "menarik" yang mungkin tidak Anda harapkan jika Anda membuat pengguna menjalankan budaya di mana sistem kalender default bukan kalender Gregorian. Misalnya, ambil kode berikut:
Itu menghasilkan output (pada 18 September 2013) dari:
Dugaan saya adalah bahwa layanan web Anda akan terkejut dengan itu!
Saya sebenarnya menyarankan tidak hanya menggunakan budaya invarian, tetapi juga mengubah ke format tanggal ISO-8601:
Ini adalah format yang lebih diterima secara global - format ini juga dapat disortir, dan membuat urutan bulan dan hari menjadi jelas. (Bahwa 06/07/2013 dapat diartikan sebagai 7 Juni atau 6 Juli tergantung pada budaya pembaca.)
sumber
useUserOverride
parameter ke false, jika tidak beberapa pengaturan pengguna dapat menimpa pengaturan budaya. Misalnya dalam kasus Anda, saya sarankan untuk menggunakan yang baruCultureInfo("ar-SA", false)
.:
memiliki arti khusus: itu adalah pemisah waktu. ( String Format Tanggal dan Waktu Kustom ).Gunakan
\
untuk menghindarinya:Atau gunakan
CultureInfo.InvariantCulture
:Saya akan menyarankan pergi dengan yang kedua, karena
/
memiliki makna khusus juga (itu adalah pemisah tanggal. ), Sehingga Anda dapat memiliki masalah dengan itu juga.sumber
Anda dapat menggunakan InvariantCulture karena pengguna Anda harus berada dalam budaya yang menggunakan titik alih-alih titik dua:
sumber
Saya bertemu dengan masalah ini belakangan ini dengan Windows 10 dari arah lain, dan menemukan jawaban dari @JonSkeet sangat membantu dalam memecahkan masalah saya.
Saya juga melakukan riset lebih lanjut dengan formulir tes dan menemukan bahwa ketika budaya saat ini diatur ke
"no"
atau"nb-NO"
saat runtime (Thread.CurrentThread.CurrentCulture = new CultureInfo("no");
), panggilan ToString ("yyyy-MM-dd HH: mm: ss") merespons secara berbeda pada Windows 7 dan Windows 10. Ini mengembalikan apa yang saya harapkan di Windows 7 dan HH.mm.ss di Windows 10!Saya pikir ini agak menakutkan! Karena saya percaya bahwa budaya adalah budaya di setiap versi Windows setidaknya.
sumber
Anda dapat menggunakan String.Format:
sumber
Konversi Tanggal Ke String
Gunakan nama Spasi
Kode
sumber