我的应用以UTC格式获取DateTime对象,需要以EST格式输出为字符串。我已经尝试了以下代码,但是当我得到输出时,偏移仍显示为+00:00而不是-05:00
static void Main(string[] args)
{
var currentDate = DateTime.Now.ToUniversalTime();
var convertedTime = ConvertUtcToEasternStandard(currentDate);
Console.WriteLine(currentDate.ToString("yyyy-MM-ddTHH:mm:sszzz"));
Console.WriteLine(convertedTime.ToString("yyyy-MM-ddTHH:mm:sszzz"));
}
private static DateTime ConvertUtcToEasternStandard(DateTime dateTime)
{
var easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
return TimeZoneInfo.ConvertTimeFromUtc(dateTime, easternZone);
}
输出:
2016-11-18T06:56:14+00:00
2016-11-18T01:56:14+00:00
所以时间正确移动,但当我希望它为-05:00时,偏移量保持在+00:00。知道如何使用上面的格式字符串输出时,如何使用正确的偏移量获取DateTime对象?
答案 0 :(得分:2)
我不久前在API中读过这篇文章,基本上,DateTime
值,zzz
格式偏移是非常不可能的。
使用DateTime值,“zzz”自定义格式说明符表示本地操作系统的时区与UTC的签名偏移量,以小时和分钟为单位。它不反映实例的DateTime.Kind属性的值。因此,建议不要将“zzz”格式说明符与DateTime值一起使用。
使用DateTimeOffset值时,此格式说明符表示DateTimeOffset值与UTC的偏移量,以小时和分钟为单位。
偏移量始终以前导符号显示。加号(+)表示UTC之前的小时数,减号( - )表示UTC之后的小时数。一位数的偏移量采用前导零格式化。
例如,我在东部标准时间 ,这是我的结果:
2016-11-18T07:9:38-05:00
2016-11-18T02:9:38-05:00
显然,UTC时间的偏移量不应为-05:00
。
稍微修改您的代码,我们有一个解决方案:
void Main()
{
var currentDate = DateTimeOffset.Now.ToUniversalTime();
var convertedTime = ConvertUtcToEasternStandard(currentDate);
var format = "yyyy-MM-ddTHH:m:sszzz";
Console.WriteLine(currentDate.ToString(format));
Console.WriteLine(convertedTime.ToString(format));
}
// Define other methods and classes here
private static DateTimeOffset ConvertUtcToEasternStandard(DateTimeOffset dateTime)
{
var easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
return TimeZoneInfo.ConvertTime(dateTime, easternZone);
}
结果:
2016-11-18T07:17:46+00:00
2016-11-18T02:17:46-05:00
那更像是它。
注意:取代以前的代码,无知得到了我的最好,我没有意识到它不能正常工作。 TimeZoneInfo.ConvertTime
需要DateTimeOffset
来完成我们想要的工作。
如果我们为Pacific Standard Time
添加另一个案例:
private static DateTimeOffset ConvertUtcToPacificStandard(DateTimeOffset dateTime)
{
var pacificZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
return TimeZoneInfo.ConvertTime(dateTime, pacificZone);
}
我们得到了正确的结果:
2016-11-17T23:21:21-08:00