Saya memiliki situs web yang dihosting di zona waktu berbeda dari pengguna yang menggunakan aplikasi. Selain itu, pengguna dapat memiliki zona waktu tertentu. Saya bertanya-tanya bagaimana pengguna SO lainnya dan aplikasi mendekati ini? Bagian yang paling jelas adalah bahwa di dalam DB, tanggal / waktu disimpan dalam UTC. Ketika di server, semua tanggal / waktu harus ditangani dalam UTC. Namun, saya melihat tiga masalah yang saya coba atasi:
Mendapatkan waktu saat ini di UTC (diselesaikan dengan mudah dengan
DateTime.UtcNow
).Menarik tanggal / waktu dari database dan menampilkannya kepada pengguna. Ada banyak kemungkinan panggilan untuk mencetak tanggal pada tampilan yang berbeda. Saya sedang memikirkan beberapa lapisan di antara tampilan dan pengontrol yang dapat menyelesaikan masalah ini. Atau memiliki metode ekstensi khusus pada
DateTime
(lihat di bawah). Sisi buruk utama adalah bahwa di setiap lokasi menggunakan datetime dalam tampilan, metode ekstensi harus dipanggil!Ini juga akan menambah kesulitan untuk menggunakan sesuatu seperti
JsonResult
. Anda tidak bisa lagi dengan mudah meneleponJson(myEnumerable)
, itu harus terjadiJson(myEnumerable.Select(transformAllDates))
. Mungkin AutoMapper dapat membantu dalam situasi ini?Mendapatkan input dari pengguna (Lokal ke UTC). Sebagai contoh, POSTing formulir dengan tanggal akan memerlukan konversi tanggal ke UTC sebelumnya. Hal pertama yang terlintas dalam pikiran adalah menciptakan kebiasaan
ModelBinder
.
Berikut ini ekstensi yang saya pikir akan digunakan dalam tampilan:
public static class DateTimeExtensions
{
public static DateTime UtcToLocal(this DateTime source,
TimeZoneInfo localTimeZone)
{
return TimeZoneInfo.ConvertTimeFromUtc(source, localTimeZone);
}
public static DateTime LocalToUtc(this DateTime source,
TimeZoneInfo localTimeZone)
{
source = DateTime.SpecifyKind(source, DateTimeKind.Unspecified);
return TimeZoneInfo.ConvertTimeToUtc(source, localTimeZone);
}
}
Saya akan berpikir bahwa berurusan dengan zona waktu akan menjadi hal yang umum mengingat banyak aplikasi sekarang berbasis cloud di mana waktu lokal server bisa jauh berbeda dari zona waktu yang diharapkan.
Apakah ini telah diselesaikan dengan elegan sebelumnya? Apakah ada sesuatu yang saya lewatkan? Gagasan dan pemikiran sangat dihargai.
EDIT: Untuk menghapus beberapa kebingungan saya pikir menambahkan beberapa detail lagi. Masalahnya sekarang bukan bagaimana menyimpan waktu UTC di db, ini lebih tentang proses pergi dari UTC-> Lokal dan Lokal-> UTC. Seperti yang ditunjukkan oleh @Max Zerbini, jelas pintar untuk menempatkan UTC-> kode lokal dalam tampilan, tetapi apakah DateTimeExtensions
benar-benar menggunakan jawabannya? Ketika mendapatkan input dari pengguna, apakah masuk akal untuk menerima tanggal sebagai waktu lokal pengguna (karena itulah yang akan digunakan JS) dan kemudian menggunakan a ModelBinder
untuk mengubah ke UTC? Zona waktu pengguna disimpan dalam DB dan mudah diambil.
ModelBinder
.