iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 27
2
Modern Web

輕量高效.NET Core開源Blog引擎:Miniblog.Core系列 第 27

27.使用UTC時間需要注意Kind問題

  • 分享至 

  • xImage
  •  

之前發生使用XML存取資料方式,在本機上傳文章,出現本機顯示上傳成功卻沒有文章問題,後來調查原來是時間格式問題

舉例:

miniblog時間使用UTC格式保存資料,但是重啟伺服器後XML讀取文章資料的時間Kind是Local

在是否加入文章cache的判斷中使用判斷 文章發布時間 < DateTime.UtcNow 才會加入cache。但是因為台灣時區是GMT + 8 區域,所以結果是文章發布時間 > DateTime.UtcNow,所以判斷結果是false。

假如修正此問題,可以使用ToUniversalTime方法,在xml讀取資料時候將local時間轉為UTC時間。

Post post = new Post
{
    //..
    PubDate = DateTime.Parse(ReadValue(doc, "pubDate")).ToUniversalTime(),
    //..
};

測試程式:

using System;
using System.Linq;
using System.Collections.Generic;

public class Post
{
    public DateTime PubDate { get; set; }
}

public class Program
{
    private static string FormatDateTime(DateTime dateTime)
    {
        const string UTC = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fff'Z'";

        return dateTime.Kind == DateTimeKind.Utc
             ? dateTime.ToString(UTC)
             : dateTime.ToUniversalTime().ToString(UTC);
    }

    /* Testing environment:
     * Location : GMT + 8  
     */
    public static void Main()
    {
        //本機端時間 local
        var addPost = new Post() { PubDate = DateTime.Now }; //DateTimeKind
        Console.WriteLine($"PubDate : {addPost.PubDate} and DateTimeKind : {addPost.PubDate.Kind}");
        //^^^^結果:PubDate : 2018/9/27 20:41:17 and DateTimeKind : Local^^^^

        //MiniBlog 添加新的文章
        var newPost = new Post() { PubDate = DateTime.Parse(FormatDateTime(addPost.PubDate)) }; //MiniBlog PubDate's UTC Format 
        Console.WriteLine($"PubDate : {addPost.PubDate} and DateTimeKind : {addPost.PubDate.Kind}");
        //^^^^結果:PubDate : 2018/9/27 20:41:17 and DateTimeKind : Local^^^^
        var Cache = new List<Post>();
        Cache.Add(newPost);

        //MiniBlog 判斷條件
        var posts = Cache
             .Where(p => p.PubDate <= DateTime.UtcNow); //DateTime.UtcNow = 2018/9/27 12:31:22
        Console.WriteLine(posts.Count()); //Result:0 items
    }
}

上一篇
26.改連結字串,替換不同資料庫功能
下一篇
28.OrderBy自訂義排序,解決`1,2,10`標題排序會變成`1,10,2`問題
系列文
輕量高效.NET Core開源Blog引擎:Miniblog.Core30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1
Homura
iT邦高手 1 級 ‧ 2018-10-28 09:51:05

這系列剩3篇了加油/images/emoticon/emoticon58.gif

暐翰 iT邦大師 1 級 ‧ 2018-10-28 11:41:41 檢舉

我要留言

立即登入留言