Mengubah String menjadi DateTime

591

Bagaimana Anda mengonversi string seperti 2009-05-08 14:40:52,531menjadi DateTime?

cramopy
sumber
2
@dban Mengapa tanggapan dari @CMStidak ditandai sebagai jawaban? Mungkin ada alasan -Aku penasaran.
nam
5
@nam Pengguna menghapus akunnya, atau diblokir, tidak dapat mengkliknya atau melihat reputasi / medali. Sayangnya yang bisa kita lakukan adalah memberinya acungan jempol.
YumeYume

Jawaban:

754

Karena Anda menangani waktu berbasis 24 jam dan Anda memiliki koma yang memisahkan fraksi detik, saya sarankan Anda menentukan format khusus:

DateTime myDate = DateTime.ParseExact("2009-05-08 14:40:52,531", "yyyy-MM-dd HH:mm:ss,fff",
                                       System.Globalization.CultureInfo.InvariantCulture);
CMS
sumber
4
Mata yang bagus. Saya tidak melihat koma di OP.
lc.
(Saya pikir Anda bermaksud menggunakan koma di string tanggal dan format, kan?)
lc.
1
Ini hanya koma karena pengaturan OPs European Locale, bagaimana jika Anda membawa kode itu ke server lain dengan US.Locale, maka fraksi bagian akan menjadi desimal bukan koma pada string yang disimpan, dan solusi Anda akan istirahat. Pastikan Anda menambahkan tanda centang untuk tipe string datetime masuk untuk Lokal yang benar sebelum menerapkan parser yang benar. Saya terkejut bahwa Microsoft belum memiliki prebuild kode ini di tempat lain di CLR atau C # .net
hamish
tidak dapat mengonversikan ini ke string waktu tanggal MyString = "06/22/1916 3:20:14 PM";
Vinod Kumar
Waktu 24 jam dan koma sebagai pemisah desimal bukan merupakan lokal kustom. Seharusnya tidak perlu ditangani secara khusus.
jpaugh
248

Anda pada dasarnya memiliki dua opsi untuk ini. DateTime.Parse()dan DateTime.ParseExact().

Yang pertama sangat memaafkan dalam hal sintaks dan akan mengurai tanggal dalam berbagai format. Ini bagus untuk input pengguna yang mungkin datang dalam format yang berbeda.

ParseExact akan memungkinkan Anda untuk menentukan format yang tepat dari string tanggal Anda untuk digunakan untuk penguraian. Baik untuk menggunakan ini jika string Anda selalu dalam format yang sama. Dengan cara ini, Anda dapat dengan mudah mendeteksi penyimpangan dari data yang diharapkan.

Anda dapat mengurai input pengguna seperti ini:

DateTime enteredDate = DateTime.Parse(enteredString);

Jika Anda memiliki format spesifik untuk string, Anda harus menggunakan metode lain:

DateTime loadedDate = DateTime.ParseExact(loadedString, "d", null);

"d"singkatan dari pola tanggal pendek (lihat MSDN untuk info lebih lanjut ) dan nullmenentukan bahwa budaya saat ini harus digunakan untuk mengurai string.

Sander
sumber
137

coba ini

DateTime myDate = DateTime.Parse(dateString);

cara yang lebih baik adalah ini:

DateTime myDate;
if (!DateTime.TryParse(dateString, out myDate))
{
    // handle parse failure
}
gehsekky
sumber
33

Gunakan DateTime.Parse(string):

DateTime dateTime = DateTime.Parse(dateTimeStr);
Amir Touitou
sumber
26

Sepertinya tidak ada yang menerapkan metode ekstensi. Dengan bantuan jawaban @ CMS :

Contoh sumber lengkap yang berfungsi dan lebih baik ada di sini: Gist Link

namespace ExtensionMethods {
    using System;
    using System.Globalization;

    public static class DateTimeExtensions {
        public static DateTime ToDateTime(this string s, 
                  string format = "ddMMyyyy", string cultureString = "tr-TR") {
            try {
                var r = DateTime.ParseExact(
                    s: s,
                    format: format,
                    provider: CultureInfo.GetCultureInfo(cultureString));
                return r;
            } catch (FormatException) {
                throw;
            } catch (CultureNotFoundException) {
                throw; // Given Culture is not supported culture
            }
        }

        public static DateTime ToDateTime(this string s, 
                    string format, CultureInfo culture) {
            try {
                var r = DateTime.ParseExact(s: s, format: format, 
                                        provider: culture);
                return r;
            } catch (FormatException) {
                throw;
            } catch (CultureNotFoundException) {
                throw; // Given Culture is not supported culture
            }

        }

    }
}

namespace SO {
    using ExtensionMethods;
    using System;
    using System.Globalization;

    class Program {
        static void Main(string[] args) {
            var mydate = "29021996";
            var date = mydate.ToDateTime(format: "ddMMyyyy"); // {29.02.1996 00:00:00}

            mydate = "2016 3";
            date = mydate.ToDateTime("yyyy M"); // {01.03.2016 00:00:00}

            mydate = "2016 12";
            date = mydate.ToDateTime("yyyy d"); // {12.01.2016 00:00:00}

            mydate = "2016/31/05 13:33";
            date = mydate.ToDateTime("yyyy/d/M HH:mm"); // {31.05.2016 13:33:00}

            mydate = "2016/31 Ocak";
            date = mydate.ToDateTime("yyyy/d MMMM"); // {31.01.2016 00:00:00}

            mydate = "2016/31 January";
            date = mydate.ToDateTime("yyyy/d MMMM", cultureString: "en-US"); 
            // {31.01.2016 00:00:00}

            mydate = "11/شعبان/1437";
            date = mydate.ToDateTime(
                culture: CultureInfo.GetCultureInfo("ar-SA"),
                format: "dd/MMMM/yyyy"); 
         // Weird :) I supposed dd/yyyy/MMMM but that did not work !?$^&*

            System.Diagnostics.Debug.Assert(
               date.Equals(new DateTime(year: 2016, month: 5, day: 18)));
        }
    }
}
guneysus
sumber
Nobody seems to implemented an extension methodmungkin karena tidak diperlukan ...
Yousha Aleayoub
Terkadang perpustakaan standar tidak sesuai dengan kebutuhan kita. Dan inilah mengapa perlu / menggunakan perpustakaan pembantu. Menggunakan cara metode ekstensi, atau API yang lancar lebih suka FP daripada OOP atau sebaliknya. Tidak benar atau salah. Itu adalah pilihan. @YoushaAleayoub
guneysus
23

Saya mencoba berbagai cara. Apa yang berhasil bagi saya adalah ini:

Convert.ToDateTime(data, CultureInfo.InvariantCulture);

data bagi saya adalah saat-saat seperti ini 9/24/2017 9:31:34 AM

zeilja
sumber
Terlihat lebih baik, dapat menetapkan nilainya ke variabel DateTime?
Birhan Nega
20

Coba di bawah ini, di mana strDate adalah tanggal Anda dalam format 'MM / hh / tttt'

var date = DateTime.Parse(strDate,new CultureInfo("en-US", true))
Krishna
sumber
1
Tidak ada yang menyebutkan bahwa itu hanya berfungsi dengan format tertentu.
T.Todua
Kasihan ... 🙂 Coders selalu berpikir sesama coder akan mencari tahu ... Untung sebenarnya ... Membuat kita berpikir lebih banyak ...
Krishna
15
string input;
DateTime db;
Console.WriteLine("Enter Date in this Format(YYYY-MM-DD): ");
input = Console.ReadLine();
db = Convert.ToDateTime(input);

//////// this methods convert string value to datetime
///////// in order to print date

Console.WriteLine("{0}-{1}-{2}",db.Year,db.Month,db.Day);
Umair Baig
sumber
1
Anda melewatkan bagian waktu? Saya perlu tanggal & waktu, Bagaimana saya bisa melakukan itu?
Badhon Jain
15

DateTime.Parse

Sintaksis:

DateTime.Parse(String value)
DateTime.Parse(String value, IFormatProvider provider)
DateTime.Parse(String value, IFormatProvider provider, DateTypeStyles styles)

Contoh:

string value = "1 January 2019";
CultureInfo provider = new CultureInfo("en-GB");
DateTime.Parse(value, provider, DateTimeStyles.NoCurrentDateDefault););
  • Nilai: representasi string dari tanggal dan waktu.
  • Penyedia: objek yang menyediakan info spesifik budaya.
  • Gaya: opsi pemformatan yang menyesuaikan string parsing untuk beberapa metode penguraian tanggal dan waktu. Misalnya, AllowWhiteSpaces adalah nilai yang membantu mengabaikan semua ruang yang ada dalam string saat diuraikan.

Perlu juga diingat DateTime adalah objek yang disimpan sebagai angka di dalam kerangka kerja, Format hanya berlaku ketika Anda mengubahnya kembali menjadi string.

  • Parsing mengkonversi string ke tipe angka internal.

  • Memformat mengubah nilai numerik internal menjadi string yang dapat dibaca.

Saya baru-baru ini memiliki masalah di mana saya mencoba untuk mengubah DateTime untuk lulus ke Linq apa yang saya tidak sadari pada waktu itu format tidak relevan ketika melewati DateTime ke Linq Query.

DateTime SearchDate = DateTime.Parse(searchDate);
applicationsUsages = applicationsUsages.Where(x => DbFunctions.TruncateTime(x.dateApplicationSelected) == SearchDate.Date);

Dokumentasi DateTime Lengkap

Mr.B
sumber
14

Anda juga bisa menggunakan DateTime.TryParseExact () seperti di bawah ini jika Anda tidak yakin dengan nilai input.

DateTime outputDateTimeValue;
if (DateTime.TryParseExact("2009-05-08 14:40:52,531", "yyyy-MM-dd HH:mm:ss,fff", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out outputDateTimeValue))
{
    return outputDateTimeValue;
}
else
{
    // Handle the fact that parse did not succeed
}
dev.bv
sumber
2

Letakkan kode ini di kelas statis> public static class ClassName{ }

public static DateTime ToDateTime(this string datetime, char dateSpliter = '-', char timeSpliter = ':', char millisecondSpliter = ',')
{
   try
   {
      datetime = datetime.Trim();
      datetime = datetime.Replace("  ", " ");
      string[] body = datetime.Split(' ');
      string[] date = body[0].Split(dateSpliter);
      int year = date[0].ToInt();
      int month = date[1].ToInt();
      int day = date[2].ToInt();
      int hour = 0, minute = 0, second = 0, millisecond = 0;
      if (body.Length == 2)
      {
         string[] tpart = body[1].Split(millisecondSpliter);
         string[] time = tpart[0].Split(timeSpliter);
         hour = time[0].ToInt();
         minute = time[1].ToInt();
         if (time.Length == 3) second = time[2].ToInt();
         if (tpart.Length == 2) millisecond = tpart[1].ToInt();
      }
      return new DateTime(year, month, day, hour, minute, second, millisecond);
   }
   catch
   {
      return new DateTime();
   }
}

Dengan cara ini, Anda bisa menggunakannya

string datetime = "2009-05-08 14:40:52,531";
DateTime dt0 = datetime.TToDateTime();

DateTime dt1 = "2009-05-08 14:40:52,531".ToDateTime();
DateTime dt5 = "2009-05-08".ToDateTime();
DateTime dt2 = "2009/05/08 14:40:52".ToDateTime('/');
DateTime dt3 = "2009/05/08 14.40".ToDateTime('/', '.');
DateTime dt4 = "2009-05-08 14:40-531".ToDateTime('-', ':', '-');
MRT2017
sumber
2

Saya baru saja menemukan cara yang elegan:

Convert.ChangeType("2020-12-31", typeof(DateTime));

Convert.ChangeType("2020/12/31", typeof(DateTime));

Convert.ChangeType("2020-01-01 16:00:30", typeof(DateTime));

Convert.ChangeType("2020/12/31 16:00:30", typeof(DateTime), System.Globalization.CultureInfo.GetCultureInfo("en-GB"));

Convert.ChangeType("11/شعبان/1437", typeof(DateTime), System.Globalization.CultureInfo.GetCultureInfo("ar-SA"));

Convert.ChangeType("2020-02-11T16:54:51.466+03:00", typeof(DateTime)); // format: "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffzzz"
guneysus
sumber
1

Budaya yang berbeda di dunia menulis string tanggal dengan cara yang berbeda. Misalnya, di AS 01/20/2008 adalah 20 Januari 2008. Di Prancis ini akan melempar InvalidFormatException. Ini karena Prancis membaca tanggal-waktu sebagai Hari / Bulan / Tahun, dan di AS adalah Bulan / Hari / Tahun.

Akibatnya, string seperti 20/01/2008 akan diurai hingga 20 Januari 2008 di Prancis, lalu melempar InvalidFormatException di AS.

Untuk menentukan pengaturan budaya Anda saat ini, Anda dapat menggunakan System.Globalization.CultureInfo.CurrentCulture.

string dateTime = "01/08/2008 14:50:50.42";  
        DateTime dt = Convert.ToDateTime(dateTime);  
        Console.WriteLine("Year: {0}, Month: {1}, Day: {2}, Hour: {3}, Minute: {4}, Second: {5}, Millisecond: {6}",  
                          dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second, dt.Millisecond);  
Saeed Dini
sumber
1
String now = DateTime.Now.ToString("YYYY-MM-DD HH:MI:SS");//make it datetime
DateTime.Parse(now);

ini memberi Anda

2019-08-17 11:14:49.000
Abdulhakim Zeinu
sumber
-1

Apakah Anda ingin cepat?

Katakanlah Anda memiliki tanggal dengan format yyMMdd.

Cara tercepat untuk mengubahnya yang saya temukan adalah:

var d = new DateTime(
(s[0] - '0') * 10 + s[1] - '0' + 2000, 
(s[2] - '0') * 10 + s[3] - '0', 
(s[4] - '0') * 10 + s[5] - '0')

Cukup, pilih indeks sesuai dengan format tanggal pilihan Anda. Jika Anda membutuhkan kecepatan mungkin Anda tidak keberatan dengan cara fungsi 'non-generik'.

Metode ini membutuhkan sekitar 10% dari waktu yang dibutuhkan oleh:

var d = DateTime.ParseExact(s, "yyMMdd", System.Globalization.CultureInfo.InvariantCulture);
David
sumber