【问题标题】:Convert UTC DateTime to DateTimeOffset将 UTC DateTime 转换为 DateTimeOffset
【发布时间】:2012-12-05 16:47:23
【问题描述】:

我需要将UTC 日期字符串转换为DateTimeOffsets

这必须使用与计算机时区不同的时区。 例如。当前计算机时区为 +02:00,但我想创建一个偏移量为 -4:00 的 DateTimeOffset。

我已经在这里阅读了很多关于 stackoverflow 的问题,但没有一个能解决我的问题。

这就是我需要做的:

输入:“2012-11-20T00:00:00Z”

输出: DateTimeOffset with:

  • UtcDateTime of 2012-11-20 00:00
  • 已定义时区的正确 Utc 偏移量(本例中为 01:00)
  • Lo​​calDateTime:2012-11-20 01:00(= UtcDateTime + Offset)

当然必须考虑夏令时。

编辑: 为了让事情更清楚,请尝试完成以下代码sn-p:

DateTimeOffset result;
const string dateString = "2012-11-20T00:00:00Z";
var timezone = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time"); //this timezone has an offset of +01:00:00 on this date

//do conversion here

Assert.AreEqual(result.Offset, new TimeSpan(1, 0, 0));  //the correct utc offset, in this case +01:00:00
Assert.AreEqual(result.UtcDateTime, new DateTime(2012, 11, 20, 0, 0, 0)); //equals the original date
Assert.AreEqual(result.LocalDateTime, new DateTime(2012, 11, 20, 1, 0, 0));

【问题讨论】:

    标签: c# .net datetime datetimeoffset


    【解决方案1】:

    这是您正在寻找的解决方案:

    const string dateString = "2012-11-20T00:00:00Z";
    TimeZoneInfo timezone = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time"); //this timezone has an offset of +01:00:00 on this date
    
    DateTimeOffset utc = DateTimeOffset.Parse(dateString);
    DateTimeOffset result = TimeZoneInfo.ConvertTime(utc, timezone);
            
    Assert.AreEqual(result.Offset, new TimeSpan(1, 0, 0));  //the correct utc offset, in this case +01:00:00
    Assert.AreEqual(result.UtcDateTime, new DateTime(2012, 11, 20, 0, 0, 0)); //equals the original date
    Assert.AreEqual(result.DateTime, new DateTime(2012, 11, 20, 1, 0, 0));
    

    请注意,您错误地测试了 .LocalDateTime 属性 - 总是会将结果转换为计算机的本地时区。您只需要 .DateTime 属性即可。

    【讨论】:

    • @BojidarStanchev - var 没有错,但我同意使用显式键入的示例更清晰。我相应地编辑了答案。请记住,原始答案是 8 年前发布的。此外,您可以随时提出修改建议而不是抱怨。
    • 抱怨也很有效,而且省力了
    【解决方案2】:

    这是你想要的吗:

    [Test]
    public void ParseUtcDateTimeTest()
    {
        DateTime dateTime = DateTime.Parse("2012-11-20T00:00:00Z");
        Assert.AreEqual(new DateTime(2012, 11, 20, 01, 00, 00), dateTime);
        DateTimeOffset dateTimeOffset = new DateTimeOffset(dateTime);
        Assert.AreEqual(new TimeSpan(0, 1, 0, 0), dateTimeOffset.Offset);
    }
    
    • 请注意,我的断言在瑞典 (CET) 有效
    • DateTime.Parse() 上有几个重载

    这对您的转化有用吗:

    [Test]
    public void ConvertTimeTest()
    {
        DateTime dateTime = DateTime.Parse("2012-11-20T00:00:00Z");
        TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard     Time");
        DateTime convertedTime = TimeZoneInfo.ConvertTime(dateTime, cstZone);
        Assert.AreEqual(new DateTime(2012, 11, 19, 18, 00, 00), convertedTime);
        TimeSpan baseUtcOffset = cstZone.BaseUtcOffset;
        Assert.AreEqual(new TimeSpan(0, -6, 0, 0), baseUtcOffset);
    }
    

    【讨论】:

    • 如果我想使用当前时区以外的另一个时区,这将不起作用。
    • @Fabian 更新了我的答案,希望对您有所帮助
    • 我不确定这对我有什么帮助。转换 DateTime 很好,但是如何获得 DateTimeOffset?
    【解决方案3】:
    const String dateString = "2012-11-20T00:00:00Z"; 
    var offsetDate = DateTimeOffset.Parse(dateString); 
    var offsetDate2 = DateTime.Parse(dateString);
    

    输出是

    offsetDate  {20-11-2012 0:00:00 +00:00}    System.DateTimeOffset
    offsetDate2 {20-11-2012 1:00:00}           System.DateTime
    

    【讨论】:

    • 如果我想使用当前时区以外的其他时区,这将不起作用。
    • 添加第二个参数,cultureinfo。这是一个列表sharpertutorials.com/list-of-culture-codes。示例:var fmt = new CultureInfo("en-AU").DateTimeFormat;
    • 我试过这个,但无论我使用哪个 CultureInfo,DateTimeOffset 的偏移量总是 00:00:00,这不是我想要的!
    猜你喜欢
    • 2016-07-22
    • 2013-07-25
    • 2014-12-05
    • 2019-09-02
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 2011-06-24
    • 2020-10-07
    相关资源
    最近更新 更多