iT邦幫忙

0

c# 日期比較的奇怪問題,該如何修正

  • 分享至 

  • xImage

需要的是result為1,但卻是-1
a應該時間比較大才對,結果卻相反

DateTime a = DateTime.Parse("2020/5/30 12:00:00 AM");
DateTime b = DateTime.Parse("2020/5/30 08:30:00 AM");

int result = DateTime.Compare(a, b); 
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
2
打狗松鼠
iT邦新手 4 級 ‧ 2020-06-30 11:05:54
最佳解答

RTM

編輯:
怕你懶得點進去,附上圖片
https://ithelp.ithome.com.tw/upload/images/20200630/20116760L0wlWZ6Pqk.jpg

追加:抱歉,看懂了
我發現你不是看不懂用法...
12:00 AM是凌晨0點... 如果你想用中午12點應該是12:00 PM

ideone直接測試

另外問一下,如果想將AM 轉成PM 怎樣的方式會比較好?

DateTime a = DateTime.Parse("2020/5/30 12:00:00 AM");
轉換為 "2020/5/30 12:00:00 PM" 的datetime

直接對DateTime做操作就好
參考

2
一級屠豬士
iT邦大師 1 級 ‧ 2020-06-30 11:16:23

我用 PostgreSQL 把同樣的表示式轉換出來,你觀察一下.

select timestamp '2020/5/30 12:00:00 AM'
     , timestamp '2020/5/30 08:30:00 AM'
     , timestamp '2020/5/30 08:30:00 AM' - timestamp '2020/5/30 12:00:00 AM';

+---------------------+---------------------+----------+
|      timestamp      |      timestamp      | ?column? |
+---------------------+---------------------+----------+
| 2020-05-30 00:00:00 | 2020-05-30 08:30:00 | 8:30:00  |
+---------------------+---------------------+----------+
(1 row)

看更多先前的回應...收起先前的回應...

另外問一下,如果想將AM 轉成PM 怎樣的方式會比較好?

DateTime a = DateTime.Parse("2020/5/30 12:00:00 AM");
轉換為 "2020/5/30 12:00:00 PM" 的datetime

不知道你說的轉換是什麼動作? 你是要輸入,只是要調整表示法?
或是 現有資料轉換?

我建議使用 ISO8601
https://zh.wikipedia.org/wiki/ISO_8601

日期時間處理,用 AM / PM 表示法,因為受到人類口語習慣的 12點多,
還有中午,下午,有時候會執坳的轉不過來.
你可以多用幾個來測試啊.

select timestamp '2020/5/30 12:00:00 PM'
     , timestamp '2020/5/30 12:00:00 AM'
     , timestamp '2020/5/30 12:00:00 PM' - timestamp '2020/5/30 12:00:00 AM';
+---------------------+---------------------+----------+
|      timestamp      |      timestamp      | ?column? |
+---------------------+---------------------+----------+
| 2020-05-30 12:00:00 | 2020-05-30 00:00:00 | 12:00:00 |
+---------------------+---------------------+----------+

你可以找一個用 AM/PM 比較的電子錶,看他中午時變化.

select timestamp '2020/5/30 12:00:00 PM'
     , timestamp '2020/5/30 11:59:59 AM'
     , timestamp '2020/5/30 12:00:00 PM' - timestamp '2020/5/30 11:59:59 AM';
+---------------------+---------------------+----------+
|      timestamp      |      timestamp      | ?column? |
+---------------------+---------------------+----------+
| 2020-05-30 12:00:00 | 2020-05-30 11:59:59 | 0:00:01  |
+---------------------+---------------------+----------+
0
海綿寶寶
iT邦大神 1 級 ‧ 2020-06-30 11:44:29

我每次都被這種日期弄得頭昏眼花
索性一律使用 YYYYMMDDhhnnss

經過上面兩位大大開釋
我還是不確定
到底 5/30 12:00 AM 的「凌晨」
是 5/29 跨 5/30
還是 5/30 跨 5/31
/images/emoticon/emoticon02.gif

using System.IO;
using System;

class Program
{
    static void Main()
    {
        int result;
        result = DateTime.Compare(
            DateTime.Parse("2020/5/30 11:59:59 AM"), 
            DateTime.Parse("2020/5/30 08:30:00 AM")); 
        Console.WriteLine("Compare:" + result);
        result = DateTime.Compare(
            DateTime.Parse("2020/5/30 12:00:00 AM"), 
            DateTime.Parse("2020/5/30 08:30:00 AM")); 
        Console.WriteLine("Compare:" + result);
        result = DateTime.Compare(
            DateTime.Parse("2020/5/30 12:00:00 PM"), 
            DateTime.Parse("2020/5/30 08:30:00 AM")); 
        Console.WriteLine("Compare:" + result);
    }
}

通常是5/29跨5/30
要測試的話也簡單,對5/29 11:59 PM跟5/30 12:00 AM做Compare就好XD
但我習慣一律用24小時,顯示時才用12小時

5/30 12:00 AM(12小時制) = 5/30 00:00:00 (24小時制)
這樣子看就會比較清楚點。
其實在12小時制來說。12時反而都是最小的區段。
也就是說,正常24小時制是
0 1 2 3 ...... 23 來區分時區段排序
但12小時則是
AM 12 1 2 3 .... 11 PM 12 1 2 3....11
12是排在最前面,也就是最小的。

1

其實認真來說。12小時制的「12:00:00 AM」是等於 24小時制的 00:00:00

將其換算成24小時制你會比較清楚。
這邊來看的確會08:30:00 AM 會比 12:00:00 AM大沒錯。

時間比對最好還是不要用12小時制比較。會容易被12搞混。

0
japhenchen
iT邦超人 1 級 ‧ 2020-06-30 14:46:44
            DateTime a = new DateTime(2020, 5, 30, 12, 0, 0);
            DateTime b = Convert.ToDateTime("2020/05/30 AM 08:30:00");
            
            Console.WriteLine(a);
            Console.WriteLine(b.ToString());
            Console.WriteLine(a > b);
            Console.WriteLine(a.CompareTo(b));
            Console.WriteLine((a - b).TotalHours);

輸出結果

2020/5/30 下午 12:00:00
2020/5/30 上午 08:30:00
True
1
3.5

12:00:00 AM → 中午12點,並非半夜12點.....

0
fuzzylee1688
iT邦研究生 3 級 ‧ 2020-07-01 08:51:52

我以為 12小時制 00:00am~11:59am, 00:00pm~11:59pm, 會有12:00am/pm??

我要發表回答

立即登入回答