我正在研究将标准时间+ DST(“20110710115500 +1200”)转换为实际时间的项目。
它位于XML文件上,我可以提取和显示数据,但我希望将其转换为可读的。
例如..“20110710115500 +1200”至11:55:00 10/07/2011
我正在使用visual studio和silver light,以及用于Windows Phone应用程序。
我一直在阅读TimeZoneInfo.ConvertTimeToUtc方法(DateTime,TimeZoneInfo),但我似乎无法让它工作,我希望有人能指出我正确的方向。
由于
我的代码...... StartTime和EndTime以及我需要更改的日期。
编辑:我已经使用您的更改更新了代码,但是当我尝试在模拟器上运行时,它会给我一个错误。
ERROR:
“将字符串转换为DateTime时,解析字符串以在将每个变量放入日期时间对象之前获取日期”
注意:你对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; }
}
}
答案 0 :(得分: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),
答案 1 :(得分:0)
很抱歉收到了坏消息,但如果您的应用程序在夏令时更改时需要准确,那么就无法将任何本地时间转换为UTC。本地时间不能唯一标识实际时间。听起来难以置信吗?
示例:假设您在当天早上2:30过渡到夏令时。该死!上午2:30是哪个?当时钟到达凌晨3点(在我们的区域)时,当地时间会回到凌晨2点,所以凌晨2:30就会发生两次。
所以,如果你正在做一些事情,比如测量两个事件之间的时间,那么UTC就没有替代品。我已经多次遇到这个问题,我认为所有数据采集“应该”都是UTC,只能转换为本地进行可视化。这是一个根本问题。
但这并不是你所要求的。如果每年凌晨2:30多次对你的应用程序无关紧要,这里有一些示例代码,这段代码相反,但你应该可以从中获得一些用途(.Net C#):
var zoneInfo = TimeZoneInfo.FindSystemTimeZoneById(timeLocation);
var localTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime, zoneInfo);
zoneInfo是从源PC检索的字符串。