Làm thế nào để bạn chuyển đổi một chuỗi như 2009-05-08 14:40:52,531
thành một DateTime
?
Làm thế nào để bạn chuyển đổi một chuỗi như 2009-05-08 14:40:52,531
thành một DateTime
?
Câu trả lời:
Vì bạn đang xử lý thời gian dựa trên 24 giờ và bạn có dấu phẩy phân tách phần giây, tôi khuyên bạn nên chỉ định một định dạng tùy chỉnh:
DateTime myDate = DateTime.ParseExact("2009-05-08 14:40:52,531", "yyyy-MM-dd HH:mm:ss,fff",
System.Globalization.CultureInfo.InvariantCulture);
Về cơ bản, bạn có hai lựa chọn cho việc này. DateTime.Parse()
và DateTime.ParseExact()
.
Đầu tiên là rất tha thứ về cú pháp và sẽ phân tích ngày tháng theo nhiều định dạng khác nhau. Nó là tốt cho đầu vào của người dùng có thể có các định dạng khác nhau.
ParseExact sẽ cho phép bạn chỉ định định dạng chính xác của chuỗi ngày sẽ sử dụng để phân tích cú pháp. Thật tốt khi sử dụng điều này nếu chuỗi của bạn luôn ở cùng định dạng. Bằng cách này, bạn có thể dễ dàng phát hiện bất kỳ sai lệch so với dữ liệu dự kiến.
Bạn có thể phân tích cú pháp đầu vào của người dùng như thế này:
DateTime enteredDate = DateTime.Parse(enteredString);
Nếu bạn có một định dạng cụ thể cho chuỗi, bạn nên sử dụng phương thức khác:
DateTime loadedDate = DateTime.ParseExact(loadedString, "d", null);
"d"
là viết tắt của mẫu ngày ngắn (xem MSDN để biết thêm thông tin ) và null
chỉ định rằng văn hóa hiện tại nên được sử dụng để phân tích chuỗi.
Sử dụng DateTime.Parse(string)
:
DateTime dateTime = DateTime.Parse(dateTimeStr);
Không ai có vẻ thực hiện một phương pháp mở rộng. Với sự giúp đỡ của câu trả lời của @ CMS :
Ví dụ về nguồn đầy đủ đang hoạt động và được cải thiện là đây: 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
có lẽ vì không cần thiết ...
Tôi đã thử nhiều cách khác nhau. Điều làm việc cho tôi là thế này:
Convert.ToDateTime(data, CultureInfo.InvariantCulture);
data
đối với tôi là những lần như thế này 24/24/2017 9:31:34 AM
Hãy thử bên dưới, trong đó strDate là ngày của bạn ở định dạng 'MM / dd / yyyy'
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.Pude
Cú pháp:
DateTime.Parse(String value)
DateTime.Parse(String value, IFormatProvider provider)
DateTime.Parse(String value, IFormatProvider provider, DateTypeStyles styles)
Thí dụ:
string value = "1 January 2019";
CultureInfo provider = new CultureInfo("en-GB");
DateTime.Parse(value, provider, DateTimeStyles.NoCurrentDateDefault););
Bạn cũng nên nhớ DateTime là một đối tượng được lưu trữ dưới dạng số bên trong khung, Định dạng chỉ áp dụng cho nó khi bạn chuyển đổi nó thành chuỗi.
Phân tích cú pháp chuyển đổi một chuỗi thành loại số nội bộ.
Định dạng chuyển đổi giá trị số nội bộ thành một chuỗi có thể đọc được.
Gần đây tôi đã gặp sự cố khi tôi đang cố gắng chuyển đổi DateTime để chuyển sang Linq, điều tôi chưa nhận ra lúc đó là định dạng không liên quan khi chuyển DateTime sang Truy vấn Linq.
DateTime SearchDate = DateTime.Parse(searchDate);
applicationsUsages = applicationsUsages.Where(x => DbFunctions.TruncateTime(x.dateApplicationSelected) == SearchDate.Date);
Bạn cũng có thể sử dụng DateTime.TryPudeExact () như bên dưới nếu bạn không chắc chắn về giá trị đầu vào.
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
}
Đặt mã này trong một lớp tĩnh> 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();
}
}
Theo cách này, bạn có thể sử dụng
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('-', ':', '-');
Tôi chỉ tìm thấy một cách thanh lịch:
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"
Các nền văn hóa khác nhau trên thế giới viết các chuỗi ngày theo những cách khác nhau. Ví dụ: tại Hoa Kỳ ngày 20 tháng 1 năm 2008 là ngày 20 tháng 1 năm 2008. Ở Pháp, điều này sẽ đưa ra một UnlimitedFormatException. Điều này là do Pháp đọc số lần ngày là Ngày / Tháng / Năm và ở Hoa Kỳ là Tháng / Ngày / Năm.
Do đó, một chuỗi như 20/01/2008 sẽ phân tích đến ngày 20 tháng 1 năm 2008 tại Pháp và sau đó ném một UnlimitedFormatException vào Hoa Kỳ.
Để xác định cài đặt văn hóa hiện tại của bạn, bạn có thể sử dụng System.Globalization.CultInfo.CiverseCARM.
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);
cái này mang lại cho bạn
2019-08-17 11:14:49.000
Bạn có muốn nó nhanh không?
Giả sử bạn có một ngày với định dạng yyMMdd.
Cách nhanh nhất để chuyển đổi nó mà tôi tìm thấy là:
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')
Chỉ cần chọn các chỉ mục theo định dạng ngày bạn chọn. Nếu bạn cần tốc độ có lẽ bạn không bận tâm đến cách 'không chung chung' của chức năng.
Phương pháp này mất khoảng 10% thời gian cần thiết bởi:
var d = DateTime.ParseExact(s, "yyMMdd", System.Globalization.CultureInfo.InvariantCulture);
@CMS
không được đánh dấu là một câu trả lời? Có thể có một lý do - tôi tò mò.