Yanıtlar:
24 saatlik süreyi işlediğiniz ve saniye bölümünü ayıran bir virgül kullandığınız için özel bir biçim belirtmenizi öneririz:
DateTime myDate = DateTime.ParseExact("2009-05-08 14:40:52,531", "yyyy-MM-dd HH:mm:ss,fff",
System.Globalization.CultureInfo.InvariantCulture);
Bunun için temel olarak iki seçeneğiniz var. DateTime.Parse()
ve DateTime.ParseExact()
.
Birincisi sözdizimi açısından çok affedicidir ve tarihleri birçok farklı formatta ayrıştırır. Farklı formatlarda olabilecek kullanıcı girişi için iyidir.
ParseExact, ayrıştırma için kullanılacak tarih dizenizin tam biçimini belirtmenize olanak tanır. Dizeniz her zaman aynı biçimdeyse bunu kullanmak iyidir. Bu şekilde, beklenen verilerden sapmaları kolayca tespit edebilirsiniz.
Kullanıcı girişini şu şekilde ayrıştırabilirsiniz:
DateTime enteredDate = DateTime.Parse(enteredString);
Dize için belirli bir biçiminiz varsa, diğer yöntemi kullanmanız gerekir:
DateTime loadedDate = DateTime.ParseExact(loadedString, "d", null);
"d"
kısa tarih örüntüsü anlamına gelir ( daha fazla bilgi için MSDN'ye bakın ) ve null
geçerli kültürün dizeyi ayrıştırmak için kullanılması gerektiğini belirtir.
Kullanım DateTime.Parse(string)
:
DateTime dateTime = DateTime.Parse(dateTimeStr);
Hiç kimse bir uzatma yöntemi uygulamıyor gibi görünüyor. @ CMS'nin cevabının yardımıyla :
Çalışan ve geliştirilmiş tam kaynak örneği burada: 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
belki gerekli olmadığı için ...
Çeşitli yollar denedim. Benim için işe yarayan şuydu:
Convert.ToDateTime(data, CultureInfo.InvariantCulture);
data
benim için böyle zamanlar oldu 24.09.2017 09:31:34
Aşağıdakini deneyin, burada strDate 'MM / gg / yyyy' biçimindeki tarihinizdir
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
Sözdizimi:
DateTime.Parse(String value)
DateTime.Parse(String value, IFormatProvider provider)
DateTime.Parse(String value, IFormatProvider provider, DateTypeStyles styles)
Misal:
string value = "1 January 2019";
CultureInfo provider = new CultureInfo("en-GB");
DateTime.Parse(value, provider, DateTimeStyles.NoCurrentDateDefault););
DateTime'ın çerçevede dahili olarak sayı olarak depolanan bir nesne olduğunu da hatırlamakta fayda var, Biçim yalnızca dizeye geri dönüştürdüğünüzde buna uygulanır.
Bir dizeyi dahili sayı türüne dönüştürme ayrıştırma.
Dahili sayısal değeri okunabilir bir dizeye dönüştüren biçimlendirme.
Son zamanlarda, DateTime bir Linq Sorgusu geçerken biçimini fark etmedi ne zaman Linq için geçmek için bir DateTime dönüştürmek çalışıyordu bir sorun vardı.
DateTime SearchDate = DateTime.Parse(searchDate);
applicationsUsages = applicationsUsages.Where(x => DbFunctions.TruncateTime(x.dateApplicationSelected) == SearchDate.Date);
Ayrıca, giriş değerinden emin değilseniz DateTime.TryParseExact () yöntemini aşağıdaki gibi kullanabilirsiniz.
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
}
Bu kodu statik bir sınıfa koy> 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();
}
}
Bu şekilde,
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('-', ':', '-');
Sadece zarif bir yol buldum:
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"
Dünyadaki farklı kültürler tarih dizelerini farklı şekillerde yazarlar. Örneğin, ABD 01/20/2008'de 20 Ocak 2008'dir. Fransa'da bu bir InvalidFormatException oluşturur. Bunun nedeni Fransa'nın tarih saatlerini Gün / Ay / Yıl olarak okuması ve ABD'de Ay / Gün / Yıl olmasıdır.
Sonuç olarak, 20/01/2008 gibi bir dize Fransa'da 20 Ocak 2008'e ayrıştırılır ve ardından ABD'ye bir InvalidFormatException kurar.
Mevcut kültür ayarlarınızı belirlemek için System.Globalization.CultureInfo.CurrentCulture kullanabilirsiniz.
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);
bu sana verir
2019-08-17 11:14:49.000
Hızlı ister misin?
Diyelim ki yyMMdd biçiminde bir tarihiniz var.
Bulduğum dönüştürmenin en hızlı yolu:
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')
Sadece, seçtiğiniz tarih biçimine göre dizinleri seçin. Hıza ihtiyacınız varsa, muhtemelen fonksiyonun 'jenerik olmayan' yolunu düşünmezsiniz.
Bu yöntem aşağıdakilerin gerektirdiği sürenin yaklaşık% 10'unu alır:
var d = DateTime.ParseExact(s, "yyMMdd", System.Globalization.CultureInfo.InvariantCulture);
@CMS
işaretlenmedi? Bir sebep olabilir-merak ediyorum.