为什么 Convert.ToDateTime() 在这个例子中不起作用

本文关键字:不起作用 Convert ToDateTime 为什么 | 更新日期: 2023-09-27 18:28:46

我正在尝试同时使用System.DateTime.Now.ToString((和Convert.ToDateTime,并遇到了一些奇怪的行为。我已将问题范围缩小到Convert.ToDateTime。由于某种原因,使用 System.DateTime.Now 设置的 DateTime 类型与从字符串转换的日期时间类型不同。但是,当您输出它们中的任何一个时,它们看起来都是相同的。

(我尝试使用Trim((,TrimStart((和TrimEnd((无济于事。

这是在 Unity 中运行后控制台中的输出:https://i.stack.imgur.com/VWsmB.jpg

using UnityEngine;
using System;
public class DateTimeTest : MonoBehaviour {
    void Start () {
        //Save current time as a DateTime type
        DateTime saveTime = System.DateTime.Now;
        //Save above DateTime as a string
        string store = saveTime.ToString();
        //Convert it back to a DateTime type
        DateTime convertedTime = Convert.ToDateTime(store);
        //Output both DateTimes
        Debug.Log(saveTime + "'n" + convertedTime);
        //Output whether or not they match.
        if (saveTime == convertedTime)
            Debug.Log("Match: Yes");
        else
            Debug.Log("Match: No");
        //Output both DateTimes converted to binary.
        Debug.Log(saveTime.ToBinary() + "'n" + (convertedTime.ToBinary()));
    }
}

为什么 Convert.ToDateTime() 在这个例子中不起作用

当您通过DateTime.ToString()DateTime转换为字符串时,您会损失很多。

即使你包括这样的毫秒:

DateTime convertedTime =
    new DateTime(
        saveTime.Year,
        saveTime.Month,
        saveTime.Day,
        saveTime.Hour,
        saveTime.Minute,
        saveTime.Second,
        saveTime.Millisecond);

您仍然会得到与原始DateTime不相等的不同。

这样做的原因是,DateTime内部存储了许多即时报价(自 0001 年 1 月 1 日午夜 12:00:00 起(。每个刻度代表千万分之一秒。您需要获得相同数量的 Tick 才能使两个DateTime对象相等。

因此,要获得相等的DateTime,您需要这样做:

DateTime convertedTime = new DateTime(saveTime.Ticks);

或者,如果要将其转换为字符串(以存储它(,则可以将即时报价存储为字符串,如下所示:

string store = saveTime.Ticks.ToString();
DateTime convertedTime = new DateTime(Convert.ToInt64(store));
DateTime.ToString()的结果

不包括毫秒。当你把它转换回DateTime,你基本上截断了毫秒,所以它返回一个不同的值。

例如

var dateWithMilliseconds = new DateTime(2016, 1, 4, 1, 0, 0, 100);  
int beforeConversion = dateWithMilliseconds.Millisecond;  // 100
var dateAsString = dateWithMilliseconds.ToString();       // 04-01-16 1:00:00 AM (or similar, depends on culture)
var dateFromString = Convert.ToDateTime(dateAsString);
int afterConversion = dateFromString.Millisecond;         // 0

我认为您在ToString()方法期间丢失了时区。因此,重新转换DateTime最终会位于不同的时区。

还要检查DateTime.Kind属性。