2011-07-10 22 views
0

私は、標準時+ DST( "20110710115500 +1200")を実際の時間に変換するプロジェクトに取り組んでいます。EPG XML時刻をUTCに変換する方法 - Silverlight - WP7

これはXMLファイル上にあり、データをプル&表示することができますが、私はそれを読み取り可能なように変換しようとしています。

例:..「20110710115500 1200」11時55分00秒2011年10月7日

に私は、Visual Studioと銀の光を使用して、そのWindowsの携帯電話アプリケーション用しています。

私はTimeZoneInfo.ConvertTimeToUtcメソッド(DateTime、TimeZoneInfo)について読んできましたが、それはうまく動作しないようで、誰かが正しい方向に向けることを望んでいました。

おかげ

マイコード.....のStartTimeと終了時間と私は変更する必要がある日付。

EDIT:コードを変更して更新しましたが、エミュレータで実行しようとするとエラーが表示されます。

ERROR:

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





} 
+0

12時間の時間差の例を選択したので、オフセットを考慮するかどうかは不明です。異なるタイムゾーンオフセットの例を挙げてください。 (途中で12時間はDSTではありません... UTCからの完全なオフセットです) –

答えて

1

まず、あなたは、必要に応じて右の時間帯にそれを得るためにそれを操作することができるようになります。そこからのDateTime変数

DateTime showTime = DateTime.Parse(xmlValue); 

にXML値を取得する必要があります。 ToLocalTime()メソッドとToUniversalTime()メソッドがあります。
あなたは.ToString()メソッドを使用してフォーマットを渡すことができます表示する文字列にそれを取り戻すために

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

フォーマット情報は、MSDNにあるhttp://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx

編集: もう一つへあなたが提供されている時間が実際にはすべてのタイムゾーンで正しいかどうかを確認することです。たとえば、私たちは全国チャンネルを持っており、そのニュースは現地時間の午後6時に開始されますが、私が使っていたEPGソースは、東海岸に設定された時間とともに全国チャンネル用に1つのファイルを持っていました。だから、XMLからタイムゾーン情報を削除して、それらのチャンネルのローカルタイムとして扱わなければなりませんでした。

編集2: C#の基本を学ぶ必要があります。その前にC#の音色をあまりにも大きくする必要があります。あなたのクラス定義のTV2ガイドでは、このようにStartTimeとEndTimeをDateTime型に変更してください。あなたのLINQ-2-XMLクエリで

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

悪いニュースの無記名であることが申し訳ありませんが、この

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

うわー、それは素早い対応でした。あなたが提案した変更をどこに表示するか気にしなければ、自分の投稿で自分の投稿を更新します。時間を確認することについての提案にも感謝します。 – Rhys

+0

StartTimeとEndTimeのタイプをDateTimeに変更するのが理想的です。次に、let文でDateTime.Parse関数を使用します。それから始めて、日付がどのように見えるかを見てください。 –

+0

私はそれをどうやって行うのか正確には分かりません。どのセクションをdateTimeにするために変更しますか?is public stringまたはStartTime = startE1 == null? null:startE1.Value、両方を試したので、VSはそれを好きではありません。申し訳ありませんが、私は非常にこれに新しいです。 – Rhys

0

のようなのStartTimeと終了時間を設定する行を変更するが、あなたのアプリケーションは、変更を夏時間の間、精度を必要とする場合現地時間をUTCに変換することはできません。現地時間は実際の時刻を一意的に識別しません。信じられないほどの音はありませんか?

例:夏時間に移行する午前2時30分の現地時間があるとします。ああ!どちらが午前2時30分ですか?時計が午前3時に到着すると(現地時間)、現地時間は午前2時に戻りますので、午前2時30分が2回発生します。

したがって、2つのイベントの間の時間を測定するようなことをしている場合は、UTCの代替はありません。この問題が何度も起こり、すべてのデータ取得がUTCにあるべきであり、視覚化のためだけにローカルに変換されるべきだと私は考えます。それはちょっと根本的な問題です。

しかし、それは本当にあなたが尋ねたものではありません。年に一度、複数の午前2時30分am'sはここにあなたのためのいくつかのサンプルコードがあるアプリの問題ではない場合は、このコードは、反対を行くが、あなたはそれ(.NETのC#)からいくつかの使用を得ることができる必要があります:

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

zoneInfoはソースPCから取得した文字列です。

+0

それは私がやりたいことなのかどうか分かりません。私はちょうど読むのを容易にするために、時間の日付形式を人間化させたいと思っています。それは静的なXMLから直接です。 – Rhys

関連する問題