2010-11-11 2 views
5

Очень простой вопрос, касающийся разбора даты в F #. Я очень новичок в F # и .NET, поэтому, пожалуйста, несите меня.F # - Parse date

Мой день имеет формат yyyyMMDD как 20100503.

Как разобрать это на DateTime в F #.

Я пробовал System.DateTime.Parse("20100503");, но получаю ошибку.

Как передать строку формата в метод Parse?

ANSWER - Спасибо всем за ответы.

let d = System.DateTime.ParseExact("20100503", "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture); 

ответ

0

Формат не тот, который принимается.

http://msdn.microsoft.com/en-us/library/1k1skd40.aspx

Вам может понадобиться манипулировать строку перед разбором.

Вы на правильном пути, хотя.

+0

Как создать DateTimeFormatInfo с использованием формата yyyyMMDD – Raghs

+0

Я думаю, вы хотели прокомментировать это по моему ответу. Существует множество свойств, которые вы можете установить в созданном вами объекте DateTimeFormatInfo. Я считаю, что тот, который вы хотите установить, это ShortDate, я должен предупредить вас, я не знаю, будет ли это работать с разделителем NO. Вот почему я бы просто манипулировал строкой, как предлагали оба ответа. – marr75

+0

Вам нужно будет поместить строку в формат, который может использовать DateTime.Parse. Попробуйте изменить его на YYYY-MM-DD. Вы можете сказать, что использование DateTime.ParseExact также даст вам контроль над форматом. –

0

Вам необходимо использовать перегрузку DateTime.Parse, которая принимает IFormatProvider. Поставщик IFormatProvider, который вы поставляете, должен понимать этот формат.

Вы можете сделать это, создав объект DateTimeFormatInfo с правильным форматом для строки даты, которую вы кормите для синтаксического анализа.

Возможно, это большая работа за то, что вы делаете. Если вы можете сначала реорганизовать строку (скорее всего, с помощью строки даты с разделителями), вам, вероятно, будет лучше.

2

Я ответил similar question этим утром. Я не использовал F #, но если у вас есть доступ к DateTime.ParseExact, мой ответ может вам помочь.

Вы могли бы также рассмотреть TryParseExact, так что вы можете ловушку провал на основе функции, возвращающей ложь вместо того, чтобы поместить его внутрь попытке поймать:

//Using code example from my previous answer... 
string s = "100714 0700"; 
DateTime d; 
if (!DateTime.TryParseExact(s, "yyMMdd hhmm", CultureInfo.InvariantCulture, out d)) 
{ 
    // Whoops! Something is wrong with the date. 
} 


//In your case 
string s = "20100503"; 
DateTime d; 
if (!DateTime.TryParseExact(s, "yyyyMMdd", CultureInfo.InvariantCulture, out d)) 
{ 
    // Whoops! Something is wrong with the date. 
} 
+0

Мне нравится ваше предложение использовать TryParseExact. Однако использование F # отличается от C#.Он возвращает как успех, так и результат сразу: 'match DateTime.TryParseExact (s," yyyyMMdd ", CultureInfo.InvariantCulture, DateTimeStyles.None) с | true, d -> d | false, _ -> DateTime.Now'. Если вы не возражаете, я добавлю это ниже ваших версий C#. –

8

Вы должны быть в состоянии использовать пользовательский формат строка. Попробуйте следующее:

System.DateTime.ParseExact("20100503", "yyyymmdd", null);; 

Для получения более подробной информации см. http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx.

3

DateTime.ParseExact("20100503", "yyyyMMdd", CultureInfo.CurrentCulture)

Используйте метод ParseExact и использовать в нижнем регистре d вместо верхней.