将时区格式的日期时间转换为本地日期时间
Convert Time Zone formatted datetime to local date time
有人可以指出这个 "20130913095509+1000"
日期时间代表 .NET 中的哪种格式。
我可以用下面的代码解析它
string test= "20130913095509+1000";
DateTime parseDt = DateTime.ParseExact(test,
"yyyyMMddhhmmsszzzz",
CultureInfo.InvariantCulture);
//For comparison
string output= parseDt.ToString("yyyyMMddhhmmsszzzz");
//output= 20130913095509+10:00
"20130913095509+10:00"
和 "20130913095509+1000"
在 .NET 格式方面有什么区别。
几件事:
您最好将其解析为 DateTimeOffset
而不是 DateTime
。这样,您正在使用的机器的本地时区不会影响解析行为,并且您无需担心 DateTimeStyles
或 DateTimeKind
的疯狂。由于 DateTimeOffset
保留了您给它的偏移量,因此它将在从字符串到对象返回到字符串的往返过程中继续存在而不会发生变化。
根据 the documentation,zzzz
不是有效的格式说明符。它可能看起来受到某些实现的尊重,但可能发生的是 zzz
和 z
被分开解释,而后者被忽略。
遗憾的是,没有格式说明符表示带符号、小时和分钟且不带冒号的偏移量。 zzz
是最接近的,它在使用 ToString
格式化时包含一个冒号,但在使用 ParseExact
解析时将其视为可选。因此,您可以在格式字符串中使用 zzz
,但您必须在 ToString
调用后手动删除 :
。
放在一起:
string test = "20130913095509+0530";
DateTimeOffset dto = DateTimeOffset.ParseExact(test, "yyyyMMddHHmmsszzz", CultureInfo.InvariantCulture);
string output = dto.ToString("yyyyMMddHHmmsszzz").Remove(17,1);
Console.WriteLine(output); //=> 20130913095509+0530
请注意,您使用的格式接近于 ISO 8601 "basic" 格式,但是这会在日期和时间部分之间包含 T
分隔符。如果可能,您应该考虑插入 T
以使您的数据符合 ISO 8601 标准。
string test = "20130913T095509+0530";
DateTimeOffset dto = DateTimeOffset.ParseExact(test, "yyyyMMdd'T'HHmmsszzz", CultureInfo.InvariantCulture);
string output = dto.ToString("yyyyMMdd'T'HHmmsszzz").Remove(18,1);
Console.WriteLine(output); //=> 20130913T095509+0530
有人可以指出这个 "20130913095509+1000"
日期时间代表 .NET 中的哪种格式。
我可以用下面的代码解析它
string test= "20130913095509+1000";
DateTime parseDt = DateTime.ParseExact(test,
"yyyyMMddhhmmsszzzz",
CultureInfo.InvariantCulture);
//For comparison
string output= parseDt.ToString("yyyyMMddhhmmsszzzz");
//output= 20130913095509+10:00
"20130913095509+10:00"
和 "20130913095509+1000"
在 .NET 格式方面有什么区别。
几件事:
您最好将其解析为
DateTimeOffset
而不是DateTime
。这样,您正在使用的机器的本地时区不会影响解析行为,并且您无需担心DateTimeStyles
或DateTimeKind
的疯狂。由于DateTimeOffset
保留了您给它的偏移量,因此它将在从字符串到对象返回到字符串的往返过程中继续存在而不会发生变化。
根据 the documentation,zzzz
不是有效的格式说明符。它可能看起来受到某些实现的尊重,但可能发生的是zzz
和z
被分开解释,而后者被忽略。遗憾的是,没有格式说明符表示带符号、小时和分钟且不带冒号的偏移量。
zzz
是最接近的,它在使用ToString
格式化时包含一个冒号,但在使用ParseExact
解析时将其视为可选。因此,您可以在格式字符串中使用zzz
,但您必须在ToString
调用后手动删除:
。
放在一起:
string test = "20130913095509+0530";
DateTimeOffset dto = DateTimeOffset.ParseExact(test, "yyyyMMddHHmmsszzz", CultureInfo.InvariantCulture);
string output = dto.ToString("yyyyMMddHHmmsszzz").Remove(17,1);
Console.WriteLine(output); //=> 20130913095509+0530
请注意,您使用的格式接近于 ISO 8601 "basic" 格式,但是这会在日期和时间部分之间包含 T
分隔符。如果可能,您应该考虑插入 T
以使您的数据符合 ISO 8601 标准。
string test = "20130913T095509+0530";
DateTimeOffset dto = DateTimeOffset.ParseExact(test, "yyyyMMdd'T'HHmmsszzz", CultureInfo.InvariantCulture);
string output = dto.ToString("yyyyMMdd'T'HHmmsszzz").Remove(18,1);
Console.WriteLine(output); //=> 20130913T095509+0530