2013-07-04 169 views
2

目前我使用DateTime.Now.ToLongDateString()設置一個日期屬性,但我想在日期更詳細。目的是根據項目的日期進行排序,目前這種排序會以Thursday, July 4, 2013的格式給出日期。如果多個項目在同一天具有相同的日期屬性,則不會執行排序。是否有DateTime.Now的功能,將允許日期屬性與秒?如何使用DateTime.Now功能

要注意,日和年仍必須包括在內,因爲那種可能發生在數天,數年,但也有可能是該項目的幾個實例在同一天。你會建議什麼建議,還是有更好的方法去解決這個問題?此外,這必須適用於任何文化和任何時區。

編輯

在我的MainPage我填充一個名爲Recent帶有圖片的集合列表框。從我的設置頁面,用戶可以選擇升序或降序排序,並在此基礎上集合必須相應地排序,然後填充列表框。

MainPage.xaml.cs中

protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 

     ObservableCollection<Selfie.Models.Picture> listItems = new ObservableCollection<Selfie.Models.Picture>(PictureRepository.Instance.Pictures); 

     if (Settings.AscendingSort.Value) 
     {     
      listItems.OrderBy(x => x.DateTaken); 
      Recent.ItemsSource = listItems; 
     } 
     else 
     {     
      listItems.OrderByDescending(x => x.DateTaken); 
      Recent.ItemsSource = listItems; 
     } 
    } 

我有一個序列化和反序列化的日期時間爲圖片,這是適用於DateTaken,這我想排序的屬性的類。

+5

你爲什麼使用字符串而不直接操作'DateTime'的任何原因? –

+0

如果你得到一個包含秒的字符串,那麼同一秒內的值會發生什麼變化?那麼來自不同時區的日期呢? – Jodrell

+0

我已經從保存我的DateTaken屬性從類型字符串更改爲類型DateTime。但是,我不希望包含時區,因爲用戶可能處於不同的時區,我希望嚴格基於DateTime屬性執行排序。 – Matthew

回答

1

EDIT 2

好吧,

您需要使用OrderByDescending函數的結果。

// listItems remains unaffected. 
var sorted = listItems.OrderByDescending(); 

許多函數,特別是作用於具有不可變級別的結構的擴展,不影響源。純函數應該用「流利」的風格。回報價值需要被利用來利用。

所以,你需要做的,

Recent.ItemsSource = listItems.OrderBy(x => x.DateTaken).ToList(); 

它值得考慮像Resahrper的工具捕捉類似這樣的問題。他們是common with the DateTimeAdd functions


編輯

,因爲你在一個多文化環境工作,確保所有日期被實例化,並存儲與UTC樣,這會幫助你大量。即使在單個時區內工作,但在Day light Saving Time邊界內進行排序也是如此。

而不是DateTime.Now使用DateTime.UtcNow並保留所有值爲UTC DateTime s直到它們被導出或呈現在GUI上。

通過這種方式,您可以將蘋果與蘋果進行比較,您的排序將按預期工作,您的數據將更容易調試。


如果你開始做複雜的事物,你會發現在.Nets DateTime實施的裂縫。它正在考慮使用Jon Skeet和其他人的作品noda time,它應該能夠克服許多陷坑。


這不會跨時區,日曆或者只是夏令

如果您確實需要某種原因排序String工作,使用DateTime.Now.ToString("o");這使得一個字符串在圓柱-trip格式,

YYYY-MM-DDTHH:MM:ss.fffffff

這是很好的排序,包括一個小數部分。假設所有的值來自相同的時區和日曆。

+0

在這種情況下''o「'做了什麼?我確實需要一個可排序的字符串,因爲我基於DateTime參數對集合中的項目進行排序,並將其保存爲IsolatedStorage中的字符串。只是使用'DateTime.Now.ToString()'給出一個字符串,但排序仍然不起作用。 – Matthew

+0

@Matthew,尋求和你會發現http://msdn.microsoft.com/en-us/library/az4se3k1.aspx#Roundtrip – Jodrell

+1

@Matthew,正如我在我的答案開始說,它更有效,更簡單直接在'DateTime'結構中直接排序,而不是強制轉換爲字符串並依賴字母數字比較。 'IComparable'的'DateTime'實現適當的特殊。 – Jodrell

0

DateTime.Now.ToString()方法會給你一切格式化字符串包括在內。

但作爲@SimonBelanger指出,你應該直接排序的日期時間,而不是在字符串表示。

1

只需通過DateTime.Now直接排序,而無需轉換爲字符串。如果您將DateTime直接存儲在您的財產中,這不會成爲問題。

DateTime類型支持的日期和時間下到打勾。

您也可以格式化日期,但是您選擇來顯示,但通常在內部存儲實際的DateTime更好。

+0

+1,因爲這將是最理想的解決方案,因爲該類型已經支持它。閱讀各行之間的好工作! –

+0

我想不出一個現實的非典型場景,但我想有些人「知道得更好」。 'DateTime's'IComparable'的實現肯定會超越基於字母數字巧合的任何事情。 – Jodrell

2

只需直接使用DateTime對象。它會給你一天,一個月,一年,一小時,一分鐘,幾秒鐘,這足以做你的排序。

例如: -

var foo = collection.OrderBy(d => d.Date); 
+1

@ReedCopsey Pedantic?你確切地知道我的意思。無論如何編輯。 – DGibbs

+0

我沒有讓你失望 - 但是確實提到了它,因爲它實際上是論壇等的一個相當常見的問題 - 新用戶通常期望有一個「僅限日期」類型;) –

0

如果您需要序列化的日期,而不是僅僅排序DateTime對象,你可以嘗試,因爲開始將其轉換爲UNIX時間(毫秒數。 Unix Epoch)。

stackoverflow.com/questions/9814060/...

因爲它只是一個長期的,你可以很容易地和排序它作爲其存儲在一個字符串或長或什麼的。

0

如果你可以按照裏德所說的那樣直接按DateTime排序。但是,如果你不能,你會想要一個非常具體的方式。可能是這樣的:

date.ToString("YYYYMMddHHmmss") 

因爲要以字符方式排序日期,您需要按照正確的順序對日期的各個部分進行排序。

0

您可以使用DateTime.Now.ToString("YYYYMMddHHmmss")DateTime.Now.Ticks

0

如果添加這段代碼DateTime.Now.ToString();將打印7/4/2013 10:05:18 PM, 如果你添加string time = DateTime.Now.ToString("hh-mm-ss");它將打印(10-07-36)。 在tostring方法中,您可以根據您的要求格式化日期。

+0

將字符串轉換爲dateTime,那麼它會是容易爲您排序 – Vignesh