【问题标题】:Converting a datetime to a particular timezone but in a specific format c#将日期时间转换为特定时区但采用特定格式 c#
【发布时间】:2021-08-21 17:51:22
【问题描述】:

我不完全确定这是否可能,我已经尝试了很多方法,但没有编写算法。

我有一个日期时间类型的变量,我想将其转换为特定时区和特定格式。举个例子吧

tod​​ayCloseLine -> 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

希望对你有帮助

【问题讨论】:

  • 如果您的客户接受 ISO8601 格式,那么偏移部分是什么无关紧要,只需向他们发送 UTC 时间即可。
  • 不太确定是什么阻碍了您。你的意思是你想要closeline_local.ToString("yyyy-MM-dd'T'HH:mm:ss.FFFFFFFzzz")
  • 你能发布你的示例代码吗?
  • 这是不可能的,zzz 格式说明符为您提供了与 UTC 的偏移量,因此我们确实需要查看您的其余代码以了解为什么您首先会得到这样的时间。
  • 使用DateTimeOffset 类。它将转换为正确包含偏移后缀的字符串。

标签: c# .net datetime datetimeoffset


【解决方案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 Method

  2. DateTimeOffset.ToString Method

【讨论】:

  • OP 已经说过这在 cmets 中不起作用。另外,你不应该在没有解释的情况下发布代码。
  • @DavidG 你用的是 F 而不是 f 这就是为什么它不起作用
  • 不要重新发明 .NET 库中已有的 DateTimeOffset 类。
  • FWIW 这是 DateTimeOffset 的内置 "o" 格式,请参阅 docs.microsoft.com/en-us/dotnet/standard/base-types/…
  • 您还应该能够跳过closeline_localutcOffsett 行,只需执行DateTimeOffset dto = TimeZoneInfo.ConvertTime(new DateTimeOffset(close_line_UTC), myTimeZone); 当您为DateTimeOffset 输入调用ConvertTime 时,它会自动设置偏移量结果。
猜你喜欢
  • 1970-01-01
  • 2018-03-14
  • 1970-01-01
  • 1970-01-01
  • 2014-11-17
  • 2020-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多