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

时间:2016-01-03 23:53:06

标签: c# datetime unity3d

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

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

这是在以统一方式运行之后控制台中的输出: 的 http://imgur.com/1ZIdPH4

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()));
    }
}

3 个答案:

答案 0 :(得分:8)

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

即使你包括这样的毫秒:

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起)。每个刻度表示一千万分之一秒。您需要为两个DateTime对象获得相同数量的Ticks。

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

DateTime convertedTime = new DateTime(saveTime.Ticks);

或者如果您想将其转换为字符串(存储它),您可以将刻度存储为如下字符串:

string store = saveTime.Ticks.ToString();

DateTime convertedTime = new DateTime(Convert.ToInt64(store));

答案 1 :(得分:3)

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

答案 2 :(得分:1)

我认为你在ToString()方法中失去了你的时区。因此,重新转换后的DateTime最终会出现在不同的时区。

同时检查DateTime.Kind属性。