首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#用时区差计算时间和日期

C#用时区差计算时间和日期
EN

Stack Overflow用户
提问于 2015-11-02 17:56:06
回答 2查看 1K关注 0票数 1

我遇到了一个小问题,我正在连接到Pokerstars.com数据流,以获取计划中的扑克锦标赛信息(https://www.pokerstars.com/datafeed/tournaments/all.xml)的最新信息。

然后,我解析这些信息并将其存储在Winforms应用程序中的listView中,但是我需要计算出包括本地时区差异在内的正确时间。我知道Pokerstar服务器在-05:00运行,但我的问题是将其转换为应用程序的特定用户的正确时间。

是否有人为该用户计算出将其转换为本地时间的代码,从而显示正确的启动时间。下面是我用来读取XML文件的代码:

代码语言:javascript
复制
    private void LoadAllTournaments()
    {
        DataSet ds = new DataSet();
        ds.ReadXml("http://46.101.5.145/Feeds/all.xml");

        ListViewItem item;

        foreach (DataRow dr in ds.Tables["tournament"].Rows)
        {

            StartDate = dr["start_date"].ToString();

            if (dr["play_money"].ToString() != "true")
            {

                FPPFee = Convert.ToInt32(dr["fpp_fee"]);

                if (FPPFee == 0)
                {

                    if (dr["buy_in_fee"].ToString() != "$0 + $0")
                    {

                        item = new ListViewItem(new string[] { dr["name"].ToString(), StartDate.Substring(0, 10), StartDate.Substring(12, 7), dr["buy_in_fee"].ToString(), dr["prize"].ToString(), dr["players"].ToString(), dr["status"].ToString(), dr["id"].ToString()});
                        listView1.Items.Add(item);

                    }

                }

            }

        }

    }

为了记录在案,我连接到自己的服务器来读取文件,因为Pokerstar只允许来自英国的人查看XML文件,所以他们每10分钟下载一次到我的UK VPS。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-02 18:15:03

在xml中,提供的值如下:

代码语言:javascript
复制
<start_date>2015-11-02T12:50:00-05:00</start_date>

因此,您不需要预先了解服务器的时区,因为偏移量是在数据中编码的。只需将字符串解析为DateTimeOffset,然后使用TimeZoneInfo将其转换为用户的时区。

代码语言:javascript
复制
DateTimeOffset startDate = DateTimeOffset.ParseExact(
    (string) dr["start_date"],
    "yyyy-MM-dd'T'HH:mm:sszzz",
    CultureInfo.InvariantCulture);

TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
DateTimeOffset converted = TimeZoneInfo.ConvertTime(startDate, tz);

在上面的示例中,"GMT Standard Time"是用于伦敦的Windows标识符,它在冬季使用GMT (UTC+00:00),在夏季使用BST (UTC+01:00)。当然,您需要知道哪个时区实际上适用于您的用户。

在后面的代码中,您使用Substring提取日期的部分内容--您不应该这样做,而是应该使用格式化字符串。例如,日期为converted.ToString("d"),时间为converted.ToString("t")。请参阅MSDN中的标准自定义格式字符串。

票数 2
EN

Stack Overflow用户

发布于 2015-11-02 18:01:57

首先,您必须将StartDate解析为一个日期时间。我不知道字符串是什么,您可能需要更精确地解析它,但一般来说:

代码语言:javascript
复制
DateTime origDate = DateTime.Parse(StartDate);

然后加或减几个小时就可以得到你想要的时区。例如:

代码语言:javascript
复制
DateTime newDate =   origDate.AddHours(-1);

减去一个小时。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33483894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档