2016-01-03 56 views
4

我試圖使用System.DateTime.Now.ToString()和Convert.ToDateTime,並且遇到了一些奇怪的行爲。我已經將問題縮小到了Convert.ToDateTime。出於某種原因,使用System.DateTime.Now設置的DateTime類型與從字符串轉換的類型不同。但是,當你輸出他們中的任何一個時,他們看起來都是一樣的。爲什麼Convert.ToDateTime()在這個例子中不起作用?

(我一直在使用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())); 
    } 
} 
+0

我覺得這個問題是捏造的,並沒有任何適用的原因。你爲什麼想用'DatTime'來操作?你的主要目標是什麼? –

+0

將DateTime保存在文件中供以後使用。正如我所說,我縮小了它的範圍以便將問題從源頭上分離出來,以便快速理解和解決問題,因此我可以看到您認爲它不適用。 – Wafer

+0

在這種情況下,您應該使用序列化。 –

回答

8

當您通過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以來)。每個滴答表示千分之一秒。您需要獲得與兩個DateTime對象相同數量的Ticks。

因此,要獲得一個平等DateTime,你需要這樣做:

DateTime convertedTime = new DateTime(saveTime.Ticks); 

或者,如果你想將它轉換爲字符串(存儲),您可將蜱存儲爲像一個字符串這個:

string store = saveTime.Ticks.ToString(); 

DateTime convertedTime = new DateTime(Convert.ToInt64(store)); 
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 
+0

謝謝!在我將字符串轉換回DateTime之前或之後,是否有方法可以將毫秒級聯起來? – Wafer

+0

@Wafer這是不夠的。檢查雅各布馬薩德的答案 - 你需要相同的'Ticks' for 2'DateTime's是相等的。我不認爲你可以轉換成一個人類可讀的字符串,而不會丟失精度(除非你直接轉換'Ticks')。 –

1

我認爲你是ToString()方法的過程中失去你的時區。所以重新轉換的DateTime結束於不同的時區。

請檢查DateTime.Kind屬性。

相關問題