我们如何在特定时区创建日期/时间并输出与UTC偏移的短ISO 8601日期/时间?例如,2015年9月8日下午5点太平洋标准时间必须如下所示:
2015-09-08T17:00:00-07:00
Run Code Online (Sandbox Code Playgroud)
这是我目前的尝试.
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
虽然看似太多步骤,但这种方法很有效.
LocalDateTimeDateTimeZoneLocalDateTime为aZonedDateTimeZonedDateTime为OffsetDateTime我们如何用更少的步骤来做到这一点?
正如问题评论中所述,您只需要一个ZonedDateTime,以实现您想要的格式(不需要OffsetDateTime).格式字符串传递"常规"偏移模式,以便仅当偏移量具有分钟时才应包括分钟("中等格式").
zonedDateTime.ToString(
"yyyy-MM-ddTHH:mm:sso<g>",
System.Globalization.CultureInfo.InvariantCulture)
Run Code Online (Sandbox Code Playgroud)
为简洁起见,这里列出了可用的偏移模式:
- 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)
Run Code Online (Sandbox Code Playgroud)
资料来源: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);
}
}
Run Code Online (Sandbox Code Playgroud)
这允许您的本地日期时间对象非常容易地转换为字符串:
localDateTime.ToStringWithOffset();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1798 次 |
| 最近记录: |