之前發生使用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
}
}