【问题标题】:How to convert EPG XML Time to UTC - Silverlight - WP7如何将 EPG XML 时间转换为 UTC - Silverlight - WP7
【发布时间】:2011-07-10 07:31:04
【问题描述】:

我正在研究将标准时间 + DST(“20110710115500 +1200”)转换为实际时间的项目。

它位于 XML 文件中,我可以提取和显示数据,但我希望将其转换为可读。

例如,“20110710115500 +1200”到 2011 年 10 月 7 日 11:55:00

我正在使用 Visual Studio 和 Silver Light,并将其用于 Windows Phone 应用程序。

我一直在阅读有关 TimeZoneInfo.ConvertTimeToUtc 方法(DateTime、TimeZoneInfo)的信息,但我似乎无法让它发挥作用,我希望有人能指出我正确的方向。

谢谢

我的代码..... StartTime 和 EndTime 以及我需要更改的日期。

编辑:我已经用您的更改更新了代码,但是当我尝试在模拟器上运行时它给了我一个错误。

错误:

“将字符串转换为日期时间时,先解析字符串取日期,然后再将每个变量放入日期时间对象”

注意:关于 C# 学习的权利,我目前正在阅读 C# 书籍。再次感谢您对此提供的帮助。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Tasks;
using System.Xml;
using System.Xml.Linq;

namespace tvGuide
{
    public partial class TV2 : PhoneApplicationPage
    {
        public TV2()
        {
            InitializeComponent();
        }




        private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
        {
            WebClient c = new WebClient();
            c.DownloadStringCompleted += new DownloadStringCompletedEventHandler(c_DownloadStringCompleted);
            c.DownloadStringAsync(new Uri("http://www.designized.com/tv/freeview.xml?"));
        }



        void c_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            if (e.Error != null)
                return;



            var r = XDocument.Parse(e.Result);


            listBox2.ItemsSource = from tv in r.Root.Descendants("programme")
                                   let channelE1 = tv.Attribute("channel")
                                   let nameEl = tv.Element("title")
                                   let urlEl = tv.Element("desc")
                                   let startE1 = tv.Attribute("start")
                                   let endE1 = tv.Attribute("stop")
                                   //let iconEl = tv.Element("icon")
                                   select new TV2guide
                                   {
                                       DisplayName = nameEl == null ? null : nameEl.Value,
                                       ChannelName = channelE1 == null ? null : channelE1.Value,
                                       ChannelURL = urlEl == null ? null : urlEl.Value,
                                       StartTime = startE1 == null ? (DateTime?)null : DateTime.Parse(startE1.Value),
                                       EndTime = endE1 == null ? (DateTime?)null : DateTime.Parse(endE1.Value),


                                       //ImageSource = iconEl == null ? null : iconEl.Attribute("src").Value,
                                   };
        }



        private void button3_Click_1(object sender, RoutedEventArgs e)
        {
            NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
        }

        private void button4_Click_1(object sender, RoutedEventArgs e)
        {
            NavigationService.GoBack();
        }
    }

    public class TV2guide
    {
        public string DisplayName { get; set; }
        public string ChannelURL { get; set; }
        public string ImageSource { get; set; }
        public DateTime? StartTime { get; set; }
        public DateTime? EndTime { get; set; }
        public string ChannelName { get; set; }
    }





}

【问题讨论】:

  • 由于您选择了一个时差为 12 小时的示例,因此不清楚是否要考虑偏移量。请举一个不同时区偏移的例子。 (顺便说一句,12 小时不是 DST……它是与 UTC 的完全偏移量。)

标签: xml silverlight linq windows-phone-7


【解决方案1】:

首先您需要将 XML 值放入 DateTime 变量中

DateTime showTime = DateTime.Parse(xmlValue);

从那里您将能够根据需要对其进行操作,以使其进入正确的时区。有 ToLocalTime() 和 ToUniversalTime() 方法。
要将其恢复为要显示的字符串,您可以使用 .ToString() 方法并传入格式。

showTime.ToString("HH:mm:ss dd/MM/yyyy");

格式信息在 MSDN http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx

编辑: 另一件要考虑的事情是,我自己编写了一个 Windows Phone EPG,它是检查你所提供的时间是否对所有时区都是正确的。例如,我们有国家频道,新闻从当地时间下午 6 点开始,但我使用的 EPG 源有一个国家频道的文件,时间设置为东海岸。所以我不得不从 XML 中删除时区信息,并将其视为这些频道的本地时间。

编辑 2: 你真的需要学习 C# 的基础知识,然后再通过它的声音深入了解它。在您的类定义 TV2guide 中,将属性 StartTime 和 EndTime 更改为 DateTime 类型,如下所示。

public DateTime? StartTime { get; set; }
public DateTime? EndTime { get; set; }

在您的 LINQ-2-XML 查询中更改像这样设置 StartTime 和 EndTime 的行

StartTime = startE1 == null ? (DateTime?)null : DateTime.ParseExact(startE1.Value, "yyyyMMddHHmmss zzz", DateTimeFormatInfo.CurrentInfo, DateTimeStyles.AssumeLocal),
EndTime = endE1 == null ? (DateTime?)null : DateTime.ParseExact(endE1.Value, "yyyyMMddHHmmss zzz", DateTimeFormatInfo.CurrentInfo, DateTimeStyles.AssumeLocal),

【讨论】:

  • 哇,反应真快。如果您不介意向我展示我在哪里进行了您建议的更改,我将使用我的代码更新我的帖子。也感谢您对检查时间的建议。
  • 理想情况下,您应该将 StartTime 和 EndTime 的类型更改为 DateTime。然后在您的 let 语句中使用 DateTime.Parse 函数。从它开始,看看日期的样子。
  • 我不确定该怎么做。我应该更改哪个部分以使它们成为日期时间,是公共字符串还是 StartTime = startE1 == null ? null : startE1.Value,因为两者都尝试过,但他们 VS 不喜欢它。抱歉,我对此很陌生。
  • 感谢您,我已经做出了您建议的更改,但我收到了格式未处理的异常。我已经在我的帖子中更新了我的代码,并围绕错误编写了详细信息。错误:“将字符串转换为 DateTime 时,在将每个变量放入日期时间对象之前解析字符串以获取日期”注意:关于 C# 学习的权利,我目前正在阅读 C# 书籍。再次感谢您对此的帮助。
  • @Rhys 更新了最后一个代码 sn-p 以使用 DateTime.ParseExact,它允许您指定传入日期字符串的格式。我检查了我的 EPG 应用程序,这就是它在那里的工作方式,很抱歉之前没有记住这段代码。
【解决方案2】:

很抱歉带来坏消息,但如果您的应用程序在夏令时更改期间需要准确性,则无法将任何本地时间转换为 UTC。当地时间并不能唯一地标识实际时间。听起来很不靠谱是不是?

示例:假设您在转换为夏令时的当地时间早上 2:30。该死!凌晨 2 点 30 分是几点?当时钟到达凌晨 3:00(在我们所在的区域)时,当地时间回到凌晨 2 点,因此凌晨 2:30 出现了两次。

因此,如果您要测量两个事件之间的时间,则无法替代 UTC。多次遇到这个问题后,我认为所有数据采集“应该”都在 UTC 中,并且只转换为本地以进行可视化。这是一个基本问题。

但这并不是你真正要问的。如果每年凌晨 2 点 30 分多次对您的应用程序来说并不重要,这里有一些示例代码适合您,这段代码正好相反,但您应该能够从中获得一些用处(.Net C#):

        var zoneInfo = TimeZoneInfo.FindSystemTimeZoneById(timeLocation);
        var localTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime, zoneInfo);

zoneInfo 是从源 PC 检索到的字符串。

【讨论】:

  • 我不确定这是否是我想要做的。我只是想将时间日期格式人性化以使其更易于阅读。它直接来自静态 XML。
猜你喜欢
  • 2020-06-13
  • 1970-01-01
  • 2015-02-19
  • 2016-06-11
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 2013-08-13
相关资源
最近更新 更多