【问题标题】:Get timezone offset and display C#获取时区偏移量并显示 C#
【发布时间】:2015-12-20 00:20:28
【问题描述】:

我需要获取正在运行我的程序的机器的当前时区偏移量,并将其显示在文本框或标签中。

这是我的代码

var offset = TimeZoneInfo.Local.GetUtcOffset(DateTime.UtcNow);

【问题讨论】:

  • 你可以简单地做var x = DateTimeOffset.Now.Offset;这是你的问题吗?
  • 它必须是 UTC 偏移量,因此它也可以获取 DST。当var x = DateTimeOffset.Now.Offset; textBox1.Text = x; 时,您的代码也会出现错误Cannot implicitly convert type 'System.TimeSpan' to 'string'

标签: c# wpf datetime textbox timezone


【解决方案1】:

您发布的获取偏移量的代码是正确的:

var offset = TimeZoneInfo.Local.GetUtcOffset(DateTime.UtcNow);

同样有效的是:

var offset = DateTimeOffset.Now.Offset;

其中任何一个的结果都是当前本地偏移量,表示为TimeSpan。您唯一缺少的部分是如何将其格式化为 string 以进行显示。虽然有多种选择,但我建议使用 "+05:30""-08:00" 之类的值。

string sign = offset < TimeSpan.Zero ? "-" : "+";
string output = sign + offset.ToString(@"hh\:mm");

然后您可以将output 字符串分配给您的标签值。

只是为了好玩,如果您想探索如何使用 Noda Time 完成相同的任务,您可以改为这样写:

Instant now = SystemClock.Instance.Now;
DateTimeZone tz = DateTimeZoneProviders.Tzdb.GetSystemDefault();
ZonedDateTime local = now.InZone(tz);
Offset offset = local.Offset;
string output = offset.ToString("m", CultureInfo.InvariantCulture);

【讨论】:

    【解决方案2】:
    YourTextBoxName.Text = offset.TotalHours.ToString();
    

    【讨论】:

    • 许多偏移量不是以整小时计算的。例如,这将为印度返回 "-5.5"
    • @MattJohnson TotalHours 返回System.Double
    • @DavidCarrigan - 是的,然后在 double 上调用 ToString。你的观点?
    • @MattJohnson 抱歉,看来我可能误解了您的评论。我以为您是在暗示这只处理整个小时,但期望的结果是包括十分之一。这是那些“长期部署”之夜之一:-/再次道歉。
    猜你喜欢
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 2016-05-07
    • 2013-10-15
    相关资源
    最近更新 更多