将datetime转换为特定时区但保持指定格式(使用C#)

4
我不确定是否有可能实现,我已经尝试了很多方法,除了编写算法之外。
我有一个类型为datetime的变量,我想将其转换为特定的时区和特定的格式。让我给出一个例子
todayCloseLine -> UTC时间 -> "2021-05-25 18:36:00"
closeline_local -> 将todayCloseLine转换为GMT标准时间 -> "2021-05-25 19:36:00"
我已经能够将其转换为给定的时区,所以没有问题。我想要的是closeline_local的这种格式
2021-05-25T18:36:00.0000000+01:00
我尝试过以下方法(还有其他方法):
在todayCloseLine上尝试ToLocalTime()。ToString(“o”),但是为此要求我的电脑应处于特定时区。这不是一个选项。
现在,我可以编写以下算法:
获取时间跨度差异,具体取哪个值大取决于情况。
获取符号,+或-,具体取哪个值大取决于情况。
然后将todayCloseLine转换为ToString(“o”),并附加符号和时间跨度,以获取最终输出。
但我想避免这样做,最好使用内置方法或其他方法进行此转换。
如果你能帮忙,谢谢。
DateTime todayCloseLine1 = DateTime.SpecifyKind(Convert.ToDateTime("25-May-2021 18:36"), DateTimeKind.Utc);
var closeline_local1 = DateTime.SpecifyKind(TimeZoneInfo.ConvertTime(
todayCloseLine1,
TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time")), DateTimeKind.Local);
var dt1 = closeline_local1.ToLocalTime().ToString("o");

var dt2 = closeline_local1.ToString("yyyy-MM-dd'T'HH:mm:ss.fffffffzzz");

OUTPUT for both dt1 and dt2 - 
2021-05-25T19:36:00.0000000+05:30 --> machine date IST
2021-05-25T19:36:00.0000000+01:00 --> machine date LONDON

希望这能帮到你。

4
不太确定你在这里遇到了什么问题。你是不是只是想要 closeline_local.ToString("yyyy-MM-dd'T'HH:mm:ss.FFFFFFFzzz") - DavidG
@Neil 我们实际上保存了 todayCloseLine 和 closeline_local,然后稍后再用于不同的目的。 - samar
@DavidG 你的代码转换成了 "2021-05-25T19:36:00-04:00"。 - samar
1
这是不可能的,zzz 格式说明符会给出相对于 UTC 的偏移量,因此我们确实需要看到您代码中的其余部分才能理解为什么首先会得到这样的时间。 - DavidG
1
使用 DateTimeOffset 类。它会正确地转换为包含偏移后缀的字符串。 - Ben Voigt
显示剩余9条评论
1个回答

1

使用 DateTimeOffset 来按所需格式格式化字符串

DateTime close_line_UTC = DateTime.SpecifyKind(Convert.ToDateTime("25-May-2021 18:36"), DateTimeKind.Utc);
var myTimeZone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
var closeline_local = TimeZoneInfo.ConvertTimeFromUtc(close_line_UTC, myTimeZone);
TimeSpan utcOffsett = myTimeZone.GetUtcOffset(closeline_local);
DateTimeOffset dateTimeOffset = new DateTimeOffset(closeline_local, utcOffsett);          
var closeline_local_formatted = dateTimeOffset.ToString("yyyy-MM-dd'T'HH:mm:ss.fffffffzzz");

参考资料

  1. DateTime.ToString 方法

  2. DateTimeOffset.ToString 方法


OP已经在评论中说过这个方法不可行。此外,您不应该发布没有解释的代码。 - DavidG
1
@DavidG 你使用了大写的 F 而不是小写的 f,这就是为什么它没有工作的原因。 - Akshay G
1
不要重新创造已经在.NET库中的DateTimeOffset类。 - Ben Voigt
1
顺便提一下,这是DateTimeOffset的内置“o”格式,请参见https://learn.microsoft.com/en-us/dotnet/standard/base-types/standard-date-and-time-format-strings。 - Ben Voigt
1
你还应该能够跳过 closeline_localutcOffsett 行,只需执行 DateTimeOffset dto = TimeZoneInfo.ConvertTime(new DateTimeOffset(close_line_UTC), myTimeZone);。当你为 DateTimeOffset 输入调用 ConvertTime 时,它会自动设置结果中的偏移量。 - Ben Voigt
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接