Как преобразовать EPG XML Time в UTC - Silverlight - WP7 - PullRequest
0 голосов
/ 10 июля 2011

Я работаю над проектом по преобразованию стандартного времени + летнее время ("20110710115500 +1200") в фактическое время.

Он находится в файле XML, и я могу вытащить и отобразить данные, но я хочу преобразовать их так, чтобы они были удобочитаемыми.

Например. "20110710115500 +1200" в 11:55: 00 10/07/2011

Я использую Visual Studio и Silver Light, и это для приложения Windows Phone.

Я читал о методе TimeZoneInfo.ConvertTimeToUtc (DateTime, TimeZoneInfo), но я не могу заставить это работать, и я надеялся, что кто-то может направить меня в правильном направлении.

Спасибо

Мой код ..... StartTime и EndTime идаты, которые мне нужно изменить.

РЕДАКТИРОВАТЬ: я обновил код с вашими изменениями, но он выдает ошибку при попытке запустить на эмуляторе.

ОШИБКА:

«При преобразовании строки в DateTime анализируйте строку, чтобы взять дату, прежде чем помещать каждую переменную в объект даты и времени» *

Отметил: Ваше право на изучение C #, в настоящее время я прохожу путь через AC# книга.Еще раз спасибо за вашу помощь в этом.

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; }
    }





}

Ответы [ 2 ]

1 голос
/ 10 июля 2011

Сначала вам нужно получить значение 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, это проверить, действительно ли время, которое вам предоставляется, является правильным для всех часовых поясов.Например, у нас есть национальные каналы, и новости начинаются в 18:00 по местному времени, но у источника 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),
0 голосов
/ 10 июля 2011

Извините, что сообщаю вам о плохих новостях, но если вашему приложению нужна точность при переходе на летнее время, преобразовать местное время в UTC невозможно.Местное время не уникально идентифицирует фактическое время.Звучит неправдоподобно, не так ли?

Пример. Скажем, у вас есть местное время 2:30 утра, когда вы переходите на летнее время.Штопать!Который 2:30 утра это?Когда часы достигли 3:00 (в нашей зоне), местное время возвращается к 2:00, поэтому 2:30 происходит дважды.

Итак, если вы делаете что-то вроде измерения времени между двумя событиями, то нетзамена для UTC.Много раз сталкиваясь с этой проблемой, я повторяю, что все данные «должны» быть в UTC и преобразованы только в локальные для визуализации.Это своего рода фундаментальная проблема.

Но это не совсем то, что вы просили.Если несколько раз в два часа ночи для вашего приложения не имеет значения, вот пример кода для вас, этот код идет наоборот, но вы должны быть в состоянии его использовать (.Net C #):

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

zoneInfo - строка, полученная с исходного компьютера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...