การแปลงสตริงเป็น DateTime


590

คุณจะทำอย่างไรแปลงสตริงเช่น2009-05-08 14:40:52,531เป็นDateTime?


2
@dban ทำไมคำตอบจาก@CMSไม่ถูกทำเครื่องหมายเป็นคำตอบ? อาจมีเหตุผล - ฉันอยากรู้อยากเห็น
nam

5
@nam User ลบบัญชีของเขาหรือถูกแบนไม่สามารถคลิกหรือดูชื่อเสียง / เหรียญ น่าเศร้าที่เราสามารถทำได้คือยกนิ้วให้เขา
YumeYume

คำตอบ:


753

เนื่องจากคุณจัดการเวลาตาม 24 ชั่วโมงและคุณมีเครื่องหมายจุลภาคคั่นเศษส่วนวินาทีฉันขอแนะนำให้คุณระบุรูปแบบที่กำหนดเอง:

DateTime myDate = DateTime.ParseExact("2009-05-08 14:40:52,531", "yyyy-MM-dd HH:mm:ss,fff",
                                       System.Globalization.CultureInfo.InvariantCulture);

4
ตาดี ฉันไม่เห็นเครื่องหมายจุลภาคใน OP
lc

(ฉันคิดว่าคุณตั้งใจจะใช้เครื่องหมายจุลภาคในวันที่และสตริงการจัดรูปแบบใช่มั้ย?)
lc

1
มันเป็นเพียงเครื่องหมายจุลภาคเนื่องจากการตั้งค่าสถานที่ในยุโรปของ OPs จะเกิดอะไรขึ้นถ้าคุณนำรหัสนั้นไปยังเซิร์ฟเวอร์อื่นที่มี USLocale เศษส่วนของส่วนจะเป็นทศนิยมไม่ใช่เครื่องหมายจุลภาคในสตริงที่บันทึกไว้และโซลูชันของคุณจะ หยุดพัก. ตรวจสอบให้แน่ใจว่าคุณเพิ่มการตรวจสอบประเภทของสายอักขระวันที่และเวลาสำหรับ Locale ที่ถูกต้องก่อนที่จะใช้โปรแกรมวิเคราะห์คำที่ถูกต้อง ฉันประหลาดใจที่ Microsoft ยังไม่มีโค้ดนี้สร้างไว้ล่วงหน้าที่อื่นใน CLR หรือ C # .net
hamish

ไม่สามารถแปลงค่านี้เป็นสตริงวันที่ MyString = "06/22/1916 3:20:14 PM";
Vinod Kumar

เวลาและเครื่องหมายจุลภาค 24 ชั่วโมงเป็นตัวคั่นทศนิยมไม่ใช่ภาษาที่กำหนดเอง ไม่จำเป็นต้องได้รับการจัดการเป็นพิเศษ
jpaugh

248

คุณมีสองทางเลือกสำหรับเรื่องนี้ และDateTime.Parse()DateTime.ParseExact()

สิ่งแรกคือให้อภัยในแง่ของไวยากรณ์และจะแยกวันที่ในรูปแบบที่แตกต่างกัน เป็นการดีสำหรับการป้อนข้อมูลของผู้ใช้ซึ่งอาจมาในรูปแบบที่แตกต่างกัน

ParseExact จะอนุญาตให้คุณระบุรูปแบบที่แน่นอนของสตริงวันที่ที่จะใช้สำหรับการวิเคราะห์คำ มันเป็นการดีที่จะใช้สิ่งนี้ถ้าสตริงของคุณอยู่ในรูปแบบเดียวกันเสมอ ด้วยวิธีนี้คุณสามารถตรวจจับความเบี่ยงเบนจากข้อมูลที่คาดไว้ได้อย่างง่ายดาย

คุณสามารถแยกวิเคราะห์ข้อมูลผู้ใช้ดังนี้:

DateTime enteredDate = DateTime.Parse(enteredString);

หากคุณมีรูปแบบเฉพาะสำหรับสตริงคุณควรใช้วิธีอื่น:

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

"d"ย่อมาจากรูปแบบวันที่สั้น (ดูMSDN สำหรับข้อมูลเพิ่มเติม ) และnullระบุว่าวัฒนธรรมปัจจุบันควรใช้สำหรับการแยกสตริง


137

ลองนี้

DateTime myDate = DateTime.Parse(dateString);

วิธีที่ดีกว่านี้ก็คือ:

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


26

ดูเหมือนว่าไม่มีใครใช้วิธีการขยาย ด้วยความช่วยเหลือของคำตอบของ@ CMS :

ตัวอย่างการทำงานและการปรับปรุงแบบเต็มซอร์สอยู่ที่นี่: 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)));
        }
    }
}

Nobody seems to implemented an extension methodอาจเป็นเพราะไม่ต้องการ ...
Yousha Aleayoub

บางครั้งห้องสมุดมาตรฐานไม่ตรงกับความต้องการของเรา และนี่คือเหตุผลที่ต้องการ / ใช้ไลบรารีตัวช่วย การใช้วิธีการส่วนขยายหรือ API ที่คล่องแคล่วเหมือนต้องการ FP มากกว่า OOP หรือในทางกลับกัน ไม่ถูกหรือผิด มันเป็นทางเลือก @YoushaAleayoub
guneysus

23

ฉันลองหลายวิธี สิ่งที่ใช้ได้ผลสำหรับฉันคือ:

Convert.ToDateTime(data, CultureInfo.InvariantCulture);

data สำหรับฉันมีเวลาเช่นนี้ 9/24/2017 9:31:34 AM


ดูดีกว่าสามารถกำหนดค่าให้กับตัวแปร DateTime ได้หรือไม่
Birhan Nega

20

ลองด้านล่างโดยที่ strDate เป็นวันที่ของคุณในรูปแบบ 'MM / dd / yyyy'

var date = DateTime.Parse(strDate,new CultureInfo("en-US", true))

1
ไม่มีใครพูดถึงว่าใช้งานได้กับรูปแบบเฉพาะนั้นเท่านั้น
T.Todua

สงสาร ... 🙂 Coders มักคิดว่าเพื่อน coders จะคิดออก ... สิ่งที่ดีจริง ๆ ... ทำให้เราคิดมากขึ้น ...
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);

1
คุณพลาดช่วงเวลาหรือไม่? ฉันต้องการทั้งวันที่ & เวลาฉันจะทำอย่างไร
Badhon Jain

15

DateTime.Parse

ไวยากรณ์:

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

ตัวอย่าง:

string value = "1 January 2019";
CultureInfo provider = new CultureInfo("en-GB");
DateTime.Parse(value, provider, DateTimeStyles.NoCurrentDateDefault););
  • ค่า: การแทนสตริงของวันที่และเวลา
  • ผู้ให้บริการ: วัตถุที่ให้ข้อมูลเฉพาะวัฒนธรรม
  • ลักษณะ: ตัวเลือกการจัดรูปแบบที่กำหนดค่าการแยกสตริงสำหรับวิธีการแยกวิเคราะห์วันที่และเวลา ตัวอย่างเช่น AllowWhiteSpaces เป็นค่าที่ช่วยละเว้นช่องว่างทั้งหมดที่มีอยู่ในสตริงในขณะที่แยกวิเคราะห์

นอกจากนี้ยังควรจำ DateTime เป็นวัตถุที่เก็บไว้เป็นตัวเลขภายในกรอบการจัดรูปแบบจะใช้กับมันเมื่อคุณแปลงกลับเป็นสตริง

  • การแยกการแปลงสตริงเป็นประเภทตัวเลขภายใน

  • การจัดรูปแบบการแปลงค่าตัวเลขภายในเป็นสตริงที่อ่านได้

เมื่อเร็ว ๆ นี้ฉันมีปัญหาที่ฉันพยายามแปลง DateTime ให้ส่งผ่านไปยัง Linq สิ่งที่ฉันไม่ได้ตระหนักในเวลานั้นรูปแบบไม่เกี่ยวข้องเมื่อผ่าน DateTime ไปยัง Linq Query

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

เอกสาร DateTime เต็ม


14

คุณยังสามารถใช้ DateTime.TryParseExact () ดังต่อไปนี้หากคุณไม่แน่ใจเกี่ยวกับค่าอินพุต

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
}

2

ใส่รหัสนี้ในระดับคงที่> 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();
   }
}

ด้วยวิธีนี้คุณสามารถใช้

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('-', ':', '-');

2

ฉันเพิ่งพบวิธีที่สง่างาม:

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"

1

วัฒนธรรมที่แตกต่างในโลกเขียนสตริงวันที่ในรูปแบบที่แตกต่างกัน ตัวอย่างเช่นในสหรัฐอเมริกา 01/20/2008 คือ 20 มกราคม 2008 ในฝรั่งเศสสิ่งนี้จะส่ง InvalidFormatException นี่เป็นเพราะฝรั่งเศสอ่านวันที่เป็นวัน / เดือน / ปีและในสหรัฐอเมริกาเป็นเดือน / วัน / ปี

ดังนั้นสตริงเช่น 20/01/2551 จะแยกเป็นวันที่ 20 มกราคม 2008 ในฝรั่งเศสแล้วโยน InvalidFormatException ในสหรัฐอเมริกา

ในการกำหนดการตั้งค่าวัฒนธรรมปัจจุบันของคุณคุณสามารถใช้ 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);  


-1

คุณต้องการมันเร็วไหม

สมมติว่าคุณมีวันที่ที่มีรูปแบบ yyMMdd

วิธีที่เร็วที่สุดในการแปลงเป็นไฟล์ที่ฉันพบคือ:

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')

เพียงเลือกดัชนีตามรูปแบบวันที่ที่คุณเลือก หากคุณต้องการความเร็วคุณอาจไม่สนใจวิธีการที่ 'ไม่ใช่แบบทั่วไป'

วิธีนี้ใช้เวลาประมาณ 10% ของเวลาที่ต้องการโดย:

var d = DateTime.ParseExact(s, "yyMMdd", System.Globalization.CultureInfo.InvariantCulture);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.