Chuyển đổi một chuỗi thành DateTime


590

Làm thế nào để bạn chuyển đổi một chuỗi như 2009-05-08 14:40:52,531thành một DateTime?


2
@dban Tại sao một phản hồi từ @CMSkhông được đánh dấu là một câu trả lời? Có thể có một lý do - tôi tò mò.
nam

5
@nam Người dùng đã xóa tài khoản của mình hoặc bị cấm, không thể nhấp vào tài khoản đó cũng như không thấy danh tiếng / huy chương. Đáng buồn thay tất cả những gì chúng ta có thể làm là cho anh ta một số ngón tay cái lên.
YumeYume

Câu trả lời:


753

Vì bạn đang xử lý thời gian dựa trên 24 giờ và bạn có dấu phẩy phân tách phần giây, tôi khuyên bạn nên chỉ định một định dạng tùy chỉnh:

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

4
Đôi mắt tốt. Tôi đã không thấy dấu phẩy trong OP.
lc.

(Tôi nghĩ rằng bạn có nghĩa là sử dụng dấu phẩy trong chuỗi ngày và định dạng, tuy nhiên, phải không?)
lc.

1
Nó chỉ là một dấu phẩy vì cài đặt Địa điểm Châu Âu của OP, nếu bạn mang mã đó đến một máy chủ khác có US.Locale, thì các phân số của một phần sẽ là dấu thập phân không phải là dấu phẩy trên chuỗi đã lưu và giải pháp của bạn sẽ phá vỡ. Hãy chắc chắn rằng bạn thêm một kiểm tra cho loại chuỗi thời gian đến cho Địa điểm chính xác của nó trước khi áp dụng trình phân tích cú pháp chính xác. Tôi ngạc nhiên rằng Microsoft không có sẵn mã này ở một nơi khác trong CLR hoặc C # .net
hamish

không thể chuyển đổi chuỗi này thành chuỗi thời gian ngày MyString = "06/22/1916 3:20:14 PM";
Vinod Kumar

Thời gian 24 giờ và dấu phẩy dưới dạng dấu phân cách thập phân không phải là miền địa phương tùy chỉnh. Nó không cần phải được xử lý đặc biệt.
jpaugh

248

Về cơ bản, bạn có hai lựa chọn cho việc này. DateTime.Parse()DateTime.ParseExact().

Đầu tiên là rất tha thứ về cú pháp và sẽ phân tích ngày tháng theo nhiều định dạng khác nhau. Nó là tốt cho đầu vào của người dùng có thể có các định dạng khác nhau.

ParseExact sẽ cho phép bạn chỉ định định dạng chính xác của chuỗi ngày sẽ sử dụng để phân tích cú pháp. Thật tốt khi sử dụng điều này nếu chuỗi của bạn luôn ở cùng định dạng. Bằng cách này, bạn có thể dễ dàng phát hiện bất kỳ sai lệch so với dữ liệu dự kiến.

Bạn có thể phân tích cú pháp đầu vào của người dùng như thế này:

DateTime enteredDate = DateTime.Parse(enteredString);

Nếu bạn có một định dạng cụ thể cho chuỗi, bạn nên sử dụng phương thức khác:

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

"d"là viết tắt của mẫu ngày ngắn (xem MSDN để biết thêm thông tin ) và nullchỉ định rằng văn hóa hiện tại nên được sử dụng để phân tích chuỗi.


137

thử cái này

DateTime myDate = DateTime.Parse(dateString);

một cách tốt hơn sẽ là thế này:

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


26

Không ai có vẻ thực hiện một phương pháp mở rộng. Với sự giúp đỡ của câu trả lời của @ CMS :

Ví dụ về nguồn đầy đủ đang hoạt động và được cải thiện là đây: 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 methodcó lẽ vì không cần thiết ...
Yousha Aleayoub

Đôi khi thư viện nổi bật không phù hợp với nhu cầu của chúng tôi. Và đây là lý do tại sao cần / sử dụng các thư viện trợ giúp. Sử dụng cách phương thức mở rộng hoặc API thông thạo ise kinda thích FP hơn OOP hoặc ngược lại. Không đúng cũng không sai. Đó là sự lựa chọn. @YoushaAleayoub
guneysus

23

Tôi đã thử nhiều cách khác nhau. Điều làm việc cho tôi là thế này:

Convert.ToDateTime(data, CultureInfo.InvariantCulture);

data đối với tôi là những lần như thế này 24/24/2017 9:31:34 AM


Có vẻ tốt hơn, có thể gán giá trị của nó cho biến DateTime không?
Birhan Nega

20

Hãy thử bên dưới, trong đó strDate là ngày của bạn ở định dạng 'MM / dd / yyyy'

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

1
Không ai đề cập rằng nó chỉ hoạt động với định dạng cụ thể đó.
T.Todua

Đáng tiếc ... Các lập trình viên luôn nghĩ rằng các lập trình viên đồng nghiệp sẽ tìm ra ... Điều tốt thực sự ... Làm cho chúng ta suy nghĩ nhiều hơn ...
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
Bạn đã bỏ lỡ phần thời gian? Tôi cần cả ngày & giờ, Làm thế nào tôi có thể làm điều đó?
Badhon Jain

15

DateTime.Pude

Cú pháp:

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

Thí dụ:

string value = "1 January 2019";
CultureInfo provider = new CultureInfo("en-GB");
DateTime.Parse(value, provider, DateTimeStyles.NoCurrentDateDefault););
  • Giá trị: chuỗi đại diện của ngày và thời gian.
  • Nhà cung cấp: đối tượng cung cấp thông tin cụ thể về văn hóa.
  • Kiểu: tùy chọn định dạng tùy chỉnh phân tích chuỗi cho một số phương pháp phân tích cú pháp ngày và giờ. Chẳng hạn, AllowWhiteSpaces là một giá trị giúp bỏ qua tất cả các khoảng trắng có trong chuỗi trong khi phân tích cú pháp.

Bạn cũng nên nhớ DateTime là một đối tượng được lưu trữ dưới dạng số bên trong khung, Định dạng chỉ áp dụng cho nó khi bạn chuyển đổi nó thành chuỗi.

  • Phân tích cú pháp chuyển đổi một chuỗi thành loại số nội bộ.

  • Định dạng chuyển đổi giá trị số nội bộ thành một chuỗi có thể đọc được.

Gần đây tôi đã gặp sự cố khi tôi đang cố gắng chuyển đổi DateTime để chuyển sang Linq, điều tôi chưa nhận ra lúc đó là định dạng không liên quan khi chuyển DateTime sang Truy vấn Linq.

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

Tài liệu DateTime đầy đủ


14

Bạn cũng có thể sử dụng DateTime.TryPudeExact () như bên dưới nếu bạn không chắc chắn về giá trị đầu vào.

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

Đặt mã này trong một lớp tĩnh> 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();
   }
}

Theo cách này, bạn có thể sử dụng

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

Tôi chỉ tìm thấy một cách thanh lịch:

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

Các nền văn hóa khác nhau trên thế giới viết các chuỗi ngày theo những cách khác nhau. Ví dụ: tại Hoa Kỳ ngày 20 tháng 1 năm 2008 là ngày 20 tháng 1 năm 2008. Ở Pháp, điều này sẽ đưa ra một UnlimitedFormatException. Điều này là do Pháp đọc số lần ngày là Ngày / Tháng / Năm và ở Hoa Kỳ là Tháng / Ngày / Năm.

Do đó, một chuỗi như 20/01/2008 sẽ phân tích đến ngày 20 tháng 1 năm 2008 tại Pháp và sau đó ném một UnlimitedFormatException vào Hoa Kỳ.

Để xác định cài đặt văn hóa hiện tại của bạn, bạn có thể sử dụng System.Globalization.CultInfo.CiverseCARM.

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
String now = DateTime.Now.ToString("YYYY-MM-DD HH:MI:SS");//make it datetime
DateTime.Parse(now);

cái này mang lại cho bạn

2019-08-17 11:14:49.000

-1

Bạn có muốn nó nhanh không?

Giả sử bạn có một ngày với định dạng yyMMdd.

Cách nhanh nhất để chuyển đổi nó mà tôi tìm thấy là:

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

Chỉ cần chọn các chỉ mục theo định dạng ngày bạn chọn. Nếu bạn cần tốc độ có lẽ bạn không bận tâm đến cách 'không chung chung' của chức năng.

Phương pháp này mất khoảng 10% thời gian cần thiết bởi:

var d = DateTime.ParseExact(s, "yyMMdd", System.Globalization.CultureInfo.InvariantCulture);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.