Risposte:
Dato che stai gestendo un orario basato su 24 ore e hai una virgola che separa la frazione di secondi, ti consiglio di specificare un formato personalizzato:
DateTime myDate = DateTime.ParseExact("2009-05-08 14:40:52,531", "yyyy-MM-dd HH:mm:ss,fff",
System.Globalization.CultureInfo.InvariantCulture);
Hai sostanzialmente due opzioni per questo. DateTime.Parse()
e DateTime.ParseExact()
.
Il primo è molto tollerante in termini di sintassi e analizzerà le date in molti formati diversi. È buono per l'input dell'utente che può venire in diversi formati.
ParseExact ti consentirà di specificare il formato esatto della stringa di date da utilizzare per l'analisi. È utile utilizzarlo se la stringa è sempre nello stesso formato. In questo modo, è possibile rilevare facilmente eventuali deviazioni dai dati previsti.
È possibile analizzare l'input dell'utente in questo modo:
DateTime enteredDate = DateTime.Parse(enteredString);
Se si dispone di un formato specifico per la stringa, è necessario utilizzare l'altro metodo:
DateTime loadedDate = DateTime.ParseExact(loadedString, "d", null);
"d"
indica il modello di data breve (vedere MSDN per ulteriori informazioni ) e null
specifica che la cultura corrente deve essere utilizzata per l'analisi della stringa.
Utilizzare DateTime.Parse(string)
:
DateTime dateTime = DateTime.Parse(dateTimeStr);
Nessuno sembra implementare un metodo di estensione. Con l'aiuto della risposta di @ CMS :
L'esempio completo e funzionante della fonte completa è qui: 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
forse perché non necessario ...
Ho provato in vari modi. Ciò che ha funzionato per me è stato questo:
Convert.ToDateTime(data, CultureInfo.InvariantCulture);
data
per me sono stati momenti come questo 24/09/2017 9:31:34
Prova di seguito, dove strDate è la tua data nel formato 'MM / gg / aaaa'
var date = DateTime.Parse(strDate,new CultureInfo("en-US", true))
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.Parse
Sintassi:
DateTime.Parse(String value)
DateTime.Parse(String value, IFormatProvider provider)
DateTime.Parse(String value, IFormatProvider provider, DateTypeStyles styles)
Esempio:
string value = "1 January 2019";
CultureInfo provider = new CultureInfo("en-GB");
DateTime.Parse(value, provider, DateTimeStyles.NoCurrentDateDefault););
Vale anche la pena ricordare che DateTime è un oggetto memorizzato come numero internamente nel framework, il formato si applica solo ad esso quando lo si converte nuovamente in stringa.
Analisi convertendo una stringa nel tipo di numero interno.
Formattazione convertendo il valore numerico interno in una stringa leggibile.
Di recente ho avuto un problema in cui stavo cercando di convertire un DateTime per passare a Linq ciò che non avevo realizzato al momento era il formato è irrilevante quando si passa DateTime a una query Linq.
DateTime SearchDate = DateTime.Parse(searchDate);
applicationsUsages = applicationsUsages.Where(x => DbFunctions.TruncateTime(x.dateApplicationSelected) == SearchDate.Date);
È inoltre possibile utilizzare DateTime.TryParseExact () come di seguito se non si è sicuri del valore di input.
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
}
Inserisci questo codice in una classe statica> 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();
}
}
In questo modo, puoi usare
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('-', ':', '-');
Ho appena trovato un modo elegante:
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"
Culture diverse nel mondo scrivono stringhe di date in modi diversi. Ad esempio, negli Stati Uniti il 20/01/2008 è il 20 gennaio 2008. In Francia ciò genererà un InvalidFormatException. Questo perché la Francia legge le date come giorno / mese / anno e negli Stati Uniti è mese / giorno / anno.
Di conseguenza, una stringa come il 20/01/2008 analizzerà il 20 gennaio 2008 in Francia e quindi genererà una InvalidFormatException negli Stati Uniti.
Per determinare le impostazioni di cultura correnti, è possibile utilizzare 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);
String now = DateTime.Now.ToString("YYYY-MM-DD HH:MI:SS");//make it datetime
DateTime.Parse(now);
questo ti dà
2019-08-17 11:14:49.000
Lo vuoi in fretta?
Supponiamo che tu abbia una data con il formato yYMMdd.
Il modo più veloce per convertirlo che ho trovato è:
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')
Basta scegliere gli indici in base al formato data desiderato. Se hai bisogno di velocità, probabilmente non ti dispiace il modo "non generico" della funzione.
Questo metodo richiede circa il 10% del tempo richiesto da:
var d = DateTime.ParseExact(s, "yyMMdd", System.Globalization.CultureInfo.InvariantCulture);
@CMS
non contrassegnata come risposta? Potrebbe esserci una ragione: sono curioso.