문자열을 DateTime으로 변환


590

어떻게 같은 문자열을 변환 할 2009-05-08 14:40:52,531DateTime?


2
@dban 왜 응답이 답변으로 @CMS표시되지 않습니까? 이유가있을 수 있습니다-궁금합니다.

5
@nam 사용자가 자신의 계정을 삭제했거나 금지 했으므로 해당 계정을 클릭하거나 평판 / 메달을 볼 수 없습니다. 슬프게도 우리가 할 수있는 것은 그에게 엄지 손가락을주는 것입니다.
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 유럽 로케일 설정으로 인해 쉼표 일뿐입니다.이 코드를 US.Locale을 사용하여 다른 서버로 가져 가면 섹션의 일부가 저장된 문자열의 쉼표가 아닌 10 진수가되고 솔루션은 단절. 올바른 구문 분석기를 적용하기 전에 올바른 로케일에 대한 수신 날짜 시간 문자열 유형을 확인하십시오. 마이크로 소프트가이 코드를 CLR이나 C # .net 어딘가에
미리 빌드

이것을 날짜 시간 문자열로 변환 할 수 없습니다. 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를 사용하면 OOP보다 FP를 선호하거나 그 반대도 마찬가지입니다. 옳고 그른 것도 아닙니다. 선택입니다. @YoushaAleayoub
guneysus

23

나는 다양한 방법으로 시도했다. 나를 위해 일한 것은 이것이었다 :

Convert.ToDateTime(data, CultureInfo.InvariantCulture);

data 나를 위해이 시간 9/24/2017 9:31:34 오전


더 좋게 보이고, DateTime 변수에 값을 할당 할 수 있습니까?
Birhan Nega

20

아래에서 strDate가 'MM / dd / yyyy'형식의 날짜입니다.

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

1
아무도 특정 형식으로 만 작동한다고 언급하지 않았습니다.
T.Todua

동정심 ... 🙂 코더는 항상 동료 코더가 알아낼 것이라고 생각합니다 ... 실제로 좋은 점 ... 더 생각하게하십시오 ...
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은 프레임 워크에 내부적으로 숫자로 저장되는 객체라는 것을 기억할 가치가 있습니다. Format은 다시 문자열로 변환 할 때만 적용됩니다.

  • 문자열을 내부 숫자 유형으로 변환 구문 분석

  • 내부 숫자 값을 읽을 수있는 문자열로 변환 형식화

최근에 Linq에 전달하기 위해 DateTime을 변환하려고하는 문제가 있었는데, 당시 TimeTime을 Linq 쿼리에 전달할 때 형식이 관련이 없다는 사실을 깨닫지 못했습니다.

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

세계의 다른 문화권은 다른 방식으로 날짜 문자열을 씁니다. 예를 들어, 미국에서 2008 년 1 월 20 일은 2008 년 1 월 20 일입니다. 프랑스에서는 InvalidFormatException이 발생합니다. 프랑스는 날짜 / 시간을 일 / 월 / 년으로 읽고 미국에서는 월 / 일 / 년입니다.

따라서 2008 년 1 월 20 일과 같은 문자열은 프랑스에서 2008 년 1 월 20 일로 구문 분석 한 다음 미국에서 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
String now = DateTime.Now.ToString("YYYY-MM-DD HH:MI:SS");//make it datetime
DateTime.Parse(now);

이건 너에게 준다

2019-08-17 11:14:49.000

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

선택한 날짜 형식에 따라 색인을 선택하십시오. 속도가 필요한 경우 기능의 '비 제네릭'방식을 신경 쓰지 않을 것입니다.

이 방법은 다음과 같은 시간이 소요됩니다.

var d = DateTime.ParseExact(s, "yyMMdd", System.Globalization.CultureInfo.InvariantCulture);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.