简体   繁体   English

将C#日期时间转换为字符串并返回

[英]convert C# date time to string and back

I'm converting C# date time to string. 我正在将C#日期时间转换为字符串。 Later when I convert it back to DateTime object it appears that they are not equal. 后来当我将它转换回DateTime对象时,看起来它们并不相同。

const string FMT = "yyyy-MM-dd HH:mm:ss.fff";
DateTime now1 = DateTime.Now;
string strDate = now1.ToString(FMT);
DateTime now2 = DateTime.ParseExact(strDate, FMT, CultureInfo.InvariantCulture);
Console.WriteLine(now1.ToBinary());
Console.WriteLine(now2.ToBinary());

Here is the example. 这是一个例子。 Looks like everything is included in string format, when I print date both displays the same, but when I compare objects or print date in binary format I see the difference. 看起来一切都包含在字符串格式中,当我打印日期时两者显示相同,但​​是当我比较对象或打印日期的二进制格式时,我看到了差异。 It looks strange to me, could you please explain what is going on here? 这对我来说很奇怪,你能解释一下这里发生了什么吗?

Here is the output for the code above. 这是上面代码的输出。

-8588633131198276118
634739049656490000

You should use the roundtrip format specifier "O" or "o" if you want to preserve the value of the DateTime . 如果要保留DateTime的值,则应使用roundtrip格式说明符“O”或“o”

The "O" or "o" standard format specifier represents a custom date and time format string using a pattern that preserves time zone information. “O”或“o”标准格式说明符使用保留时区信息的模式表示自定义日期和时间格式字符串。 For DateTime values, this format specifier is designed to preserve date and time values along with the DateTime.Kind property in text. 对于DateTime值,此格式说明符旨在保留日期和时间值以及文本中的DateTime.Kind属性。 The formatted string can be parsed back by using the DateTime.Parse(String, IFormatProvider, DateTimeStyles) or DateTime.ParseExact method if the styles parameter is set to DateTimeStyles.RoundtripKind. 如果styles参数设置为DateTimeStyles.RoundtripKind,则可以使用DateTime.Parse(String,IFormatProvider,DateTimeStyles)或DateTime.ParseExact方法解析格式化的字符串。

Using your code (apart from changing the format string): 使用您的代码(除了更改格式字符串):

const string FMT = "O";
DateTime now1 = DateTime.Now;
string strDate = now1.ToString(FMT);
DateTime now2 = DateTime.ParseExact(strDate, FMT, CultureInfo.InvariantCulture);
Console.WriteLine(now1.ToBinary());
Console.WriteLine(now2.ToBinary());

I get: 我明白了:

-8588633127598789320
-8588633127598789320

Oded's answer is good but it didn't work for me for UTC dates. Oded的答案很好,但是对于UTC日期它并不起作用。 In order to get it to work for UTC dates, I needed to specify a DateTimeStyles value of "RoundtripKind" so that it didn't try to assume it was a local time. 为了使其适用于UTC日期,我需要指定DateTimeStyles值“RoundtripKind”,以便它不会尝试假设它是本地时间。 Here is the updated code from above: 以下是上面的更新代码:

const string FMT = "O";
DateTime now1 = DateTime.Now;
string strDate = now1.ToString(FMT);
DateTime now2 = DateTime.ParseExact(strDate, FMT, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind);
Console.WriteLine(now1.ToBinary());
Console.WriteLine(now2.ToBinary());

Note, this works for both UTC and local dates. 请注意,这适用于UTC和本地日期。

2 things: 2件事:

  1. You can use the ParseExact overload that takes a DateTimeStyle parameter in order to specify AssumeLocal . 您可以使用带有DateTimeStyle参数的ParseExact重载来指定AssumeLocal

  2. There will still be a small difference between now1 and now2 unless you increase the precision to 7 digits instead of 3: "yyyy-MM-dd HH:mm:ss.fffffff" 除非你将精度提高到7位而不是3位,否则now1和now2之间仍然会有一个小的差异:“yyyy-MM-dd HH:mm:ss.fffffff”

      const string FMT = "yyyy-MM-dd HH:mm:ss.fffffff"; DateTime now1 = DateTime.Now; string strDate = now1.ToString(FMT); DateTime now2 = DateTime.ParseExact(strDate, FMT, CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal); Console.WriteLine(now1.ToBinary()); Console.WriteLine(now2.ToBinary()); 

Even without the above changes, the calculated difference between now1 and now2 appears small, even though the binary values do not appear similar. 即使没有上述更改,now1和now2之间的计算差异也很小,即使二进制值看起来不相似。

        TimeSpan difference = now2.Subtract(now1);
        Console.WriteLine(difference.ToString());

If you dont need the string to be human-readable (like, you want to cipher it before storage), you can just call string str = dt1.ToBinary().ToString(); 如果你不需要字符串是人类可读的(比如,你想在存储之前加密它),你可以只调用string str = dt1.ToBinary().ToString(); and DateTime dt2 = DateTime.FromBinary(long.Parse(str)); DateTime dt2 = DateTime.FromBinary(long.Parse(str));

DateTime now1 = DateTime.Now;
string strDate = now1.ToBinary().ToString();
DateTime now2 = DateTime.FromBinary(long.Parse(strDate));
Console.WriteLine(now1.ToBinary());
Console.WriteLine(now2.ToBinary());

Just use this code it convert date time to string and string to date time 只需使用此代码,它将日期时间转换为字符串和字符串到日期时间

 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace DateTimeConvert { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { label1.Text = ConvDate_as_str(textBox1.Text); } public string ConvDate_as_str(string dateFormat) { try { char[] ch = dateFormat.ToCharArray(); string[] sps = dateFormat.Split(' '); string[] spd = sps[0].Split('.'); dateFormat = spd[0] + ":" + spd[1] + " " + sps[1]; DateTime dt = new DateTime(); dt = Convert.ToDateTime(dateFormat); return dt.Hour.ToString("00") + dt.Minute.ToString("00"); } catch (Exception ex) { return "Enter Correct Format like <5.12 pm>"; } } private void button2_Click(object sender, EventArgs e) { label2.Text = ConvDate_as_date(textBox2.Text); } public string ConvDate_as_date(string stringFormat) { try { string hour = stringFormat.Substring(0, 2); string min = stringFormat.Substring(2, 2); DateTime dt = new DateTime(); dt = Convert.ToDateTime(hour+":"+min); return String.Format("{0:t}", dt); ; } catch (Exception ex) { return "Please Enter Correct format like <0559>"; } } } } 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM