2009-05-08 14:40:52,531のような文字列は、どのように
DateTime` に変換するのでしょうか?
これには基本的に2つのオプションがあります。DateTime.Parse()
と DateTime.ParseExact()
です。
前者は構文に関して非常に寛容で、さまざまな形式の日付をパースします。これは、さまざまなフォーマットで入力される可能性のあるユーザー入力に適しています。
ParseExact は、パースに使用する日付文字列の形式を正確に指定することができます。文字列が常に同じ形式である場合に使用するとよいでしょう。こうすることで、予想されるデータからの逸脱を簡単に検出することができます。
このようにユーザー入力をパースすることができます。
DateTime enteredDate = DateTime.Parse(enteredString);
文字列の形式が決まっている場合は、他の方法を使うべきです。
DateTime loadedDate = DateTime.ParseExact(loadedString, "d", null);
また、null
は文字列のパースに現在のカルチャを使用することを指定します。
DateTime.Parse(string)を使用します。
DateTime dateTime= DateTime.Parse(dateTimeStr);
拡張メソッドを実装した人はいません。 @ 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)));
}
}
}
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);
入力値がわからない場合は、以下のように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
}
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に渡すために変換しようとしていたという問題がありました。
DateTime SearchDate = DateTime.Parse(searchDate);
applicationsUsages = applicationsUsages.Where(x => DbFunctions.TruncateTime(x.dateApplicationSelected) == SearchDate.Date);
[完全なDateTimeドキュメント][1]。
[1]:https://docs.microsoft.com/en-us/dotnet/api/system.datetime?view = netframework-4.7.2#parsing-01。
このコードを静的クラスに配置 >パブリックスタティッククラス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('-', ':', '-');
世界のさまざまな文化がさまざまな方法で日付の文字列を書いています。 たとえば、米国では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);