2017-03-14 36 views
1

我写了一段代码,它基本上从PST时区中的数据库中提取事务。我想要做的只是将这些日期转换为CEST时区和IST(以色列标准时间)。在C#中转换时区

我不喜欢的东西如下:

var transactions = ctx.UserStores.Where(x => x.UserId == loggedUser.UserId).SelectMany(x => x.StoreItems.SelectMany(y => y.StoreItemTransactions)).ToList(); 
       var hourlyData = transactions 
       .GroupBy(x => TimeZoneInfo.ConvertTime(x.TransactionDate.Value, TimeZoneInfo.FindSystemTimeZoneById(timeZone)).Hour) 
       .Select(pr => new HourlyGraph { Hour = pr.Key, Sales = pr.Sum(x => x.QuantitySoldTransaction) }) 
       .ToList(); 

其中的timeZone参数可以是下列之一:

Central European Standard Time 

Israel Standard Time 

Pacific Standard Time 

Naurally时的timeZone参数= PST我希望在我的名单相同的结果。 ..但奇怪的是结果得到完全洗牌,我不知道为什么...

因此,我的数据库中的日期保存在PST时区,我试图conv ert他们到以上3个时区之一...

我在做什么错在这里?

+2

什么是x.TransactionDate.Value.Kind'的'的价值,什么时区中运行的代码?你有没有尝试过使用'TimeZoneInfo.ConvertTime()'这个版本,它希望两个'TimeZoneInformation'对象(源和目标) – NineBerry

+3

“结果完全被打乱” - 这是什么意思?我不清楚你的问题是什么。结果是错误的顺序(是我所假设的洗牌)?时间不对?还有别的吗?如果你能给出一个最小的问题的完整例子,那么这将有很大的帮助。 – Chris

+0

@NineBerry它说日期时间kind = System.DateTimeKind.Unspecified – User987

回答

1

使用TimeZoneInfo.ConvertTime版本的示例代码,该版本需要源时区和目标时区。

DateTime sourceTime = new DateTime(2015, 6, 10, 10, 20, 30, DateTimeKind.Unspecified); 

TimeZoneInfo sourceTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); 

foreach(var targetTimeZoneID in new string[] { "Pacific Standard Time", "Israel Standard Time", "Central European Standard Time" }) 
{ 
    TimeZoneInfo targetTimeZone = TimeZoneInfo.FindSystemTimeZoneById(targetTimeZoneID); 
    var converted = TimeZoneInfo.ConvertTime(sourceTime, sourceTimeZone, targetTimeZone); 

    Console.WriteLine("{0}: {1:yyyy-MM-dd HH:mm:ss}", targetTimeZoneID, converted); 
} 
Console.ReadLine(); 

输出是:

太平洋标准时间:2015年6月10日10时20分三十〇秒
以色列标准时间: 2015年6月10日20时20分30秒
中欧标准时间:2015年6月10日19时20分三十〇秒

+0

惊人的,这是它,非常感谢你! =) – User987