输出ISO 8601字符串

时间:2015-09-25 02:10:12

标签: c# .net nodatime

我们如何在特定时区创建日期/时间并输出a short ISO 8601 date/time with offset from UTC?例如,2015年9月8日下午5点太平洋标准时间必须如下所示:

g-recaptcha-response

这是我目前的尝试。

var app = angular.module('game', ['ngRoute']);

angular.module('game')
   .service('doorService', function() {
     this.drawDoors = function drawDoors() { 
     ....
   }
})


angular.module('game')
  .controller('canvasCtrl', function($scope, doorService) {
....
 })

虽然看起来有太多步骤,但仍有效。

  1. 创建2015-09-08T17:00:00-07:00
  2. 创建using System; using NodaTime; using NodaTime.Text; namespace ConsoleApplication1_Nodatime { class Program { public static void Log(string x) => Console.WriteLine(x); public static void Read() => Console.ReadLine(); static void Main(string[] args) { var localDateTime = new LocalDateTime(2015, 09, 08, 17, 0); var zone = DateTimeZoneProviders.Tzdb.GetZoneOrNull("America/Vancouver"); var zonedDateTime = localDateTime.InZoneStrictly(zone); Log(zonedDateTime.ToOffsetDateTime().ToString()); Read(); } } }
  3. LocalDateTime转换为DateTimeZone
  4. LocalDateTime转换为ZonedDateTime
  5. 我们如何用更少的步骤来做到这一点?

1 个答案:

答案 0 :(得分:5)

正如问题评论中所述,您只需要ZonedDateTime即可获得所需的格式(不需要OffsetDateTime)。格式字符串传递“常规”偏移模式,以便仅在偏移量为分钟时才应包括分钟(“中等格式”)。

zonedDateTime.ToString(
    "yyyy-MM-ddTHH:mm:sso<g>", 
    System.Globalization.CultureInfo.InvariantCulture)

为简洁起见,这里记录了可用的偏移模式:

  
      
  • f:全格式,显示所有信息,包括小数秒。典型的图案文字:+ HH:mm:ss.fff
  •   
  • l:长格式,显示信息到第二个。典型的图案文字:+ HH:mm:ss
  •   
  • m:中等格式,以分钟显示信息。典型图案文字:+ HH:mm
  •   
  • s:短格式,显示小时信息。典型的图案文字:+ HH
  •   
  • g:一般模式。格式化取决于传入的值:      
        
    • 如果偏移量为小数秒,则使用完整格式;否则
    •   
    • 如果偏移量为秒,则使用长格式;否则
    •   
    • 如果偏移量有分钟,则使用中等格式;否则
    •   
    • 使用短格式解析时,一次尝试一种其他标准格式模式。这是默认的格式模式。
    •   
  •   
  • G:作为g,但使用Z表示偏移量为0,就好像它是Z-prefixed。
  •   

来源:http://nodatime.org/1.3.x/userguide/offset-patterns.html

原始问题

原始请求格式为ISO-8601始终显示尾随分钟,您可以使用下面的自定义格式字符串。默认情况下,它符合ISO-8601标准,不需要尾随“:00”。但是,您可以传递偏移模式以强制您想要的格式:

zonedDateTime.ToString(
    "yyyy-MM-ddTHH:mm:sso<m>", 
    System.Globalization.CultureInfo.InvariantCulture)

来源:http://nodatime.org/1.3.x/userguide/offset-patterns.html

更新为缩短代码

如果您只是想缩短代码,可以始终将代码包装在辅助方法中 - 甚至可以作为静态扩展方法。

public static class NodaTimeHelpers
{
    public static Lazy<DateTimeZone> Zone = new Lazy<DateTimeZone>(
        () => DateTimeZoneProviders.Tzdb.GetZoneOrNull("America/Vancouver"));
    public static string ToStringWithOffset(this LocalDateTime localDateTime)
    {
        if (localDateTime == null)
            return "";
        var zonedDateTime = localDateTime.InZoneStrictly(Zone.Value);
        return zonedDateTime.ToString(
            "yyyy-MM-ddTHH:mm:sso<g>",
            System.Globalization.CultureInfo.InvariantCulture);
    }
}

这允许您的本地日期时间对象非常容易地转换为字符串:

localDateTime.ToStringWithOffset();