我正在使用saber soap API进行航班预订。
我有一个DateTime
对象需要一个带时区的参数。输入应该像"2016-03-01T10:00:00-06:00"
目前我正在获得像
这样的价值DateTime dt = DateTime.UtcNow;
string date = dt.ToString();
string tstamp = dt.ToString("mm-dd-yyyyTHH:mm:sszzz");
DateTimeOffset tstamp = DateTimeOffset.Parse(date);
DateTime datetime = tstamp.DateTime;
但是当我将其转换回DateTime
时,时区会自动删除。我无法将对象转换为DateTimeoffset
,因为API要求DateTime
格式。
答案 0 :(得分:2)
我认为这可以帮助您,可以获得您想要的日期时间或获取TimeSpan的偏移量,然后根据需要将其添加到您的日期时间或保存。
编辑: 现在我看到你可能只需要从DateTimeOffset对象获取字符串,而不是从DateTime对象获取字符串。
DateTime dt = DateTime.UtcNow;
string date = dt.ToString();
string tstampString = dt.ToString("MM-dd-yyyyTHH:mm:ssZZZ");
DateTimeOffset tstampDT = DateTimeOffset.Parse(date);
DateTime datetimeCurrent = tstampDT.DateTime;
DateTime datetimeUTC = tstampDT.UtcDateTime;
DateTime datetimeLocal = tstampDT.LocalDateTime;
TimeSpan offsetFromUTC = tstampDT.Offset;
编辑:
string tstampOffsetString = tstampDT.ToString("MM-dd-yyyyTHH:mm:sszzz");
答案 1 :(得分:0)
我试着解释一些事情;
我有一个DateTime对象,需要一个参数 时区。
不,你没有。
DateTime
没有任何隐式格式。它只有日期和时间值。 "格式"当您获得 textual (又名string
)表示时,概念仅适用。所以你可能有一个字符串有偏移部分而不是DateTime。
但是当我将其转换回DateTime时,时区会被删除 自动..
DateTime
本身不包含真实的时区信息。它可以知道它是UTC
还是Local
,但不本地真正意味着什么。此外DateTimeOffset
也没有时区信息。它只有一个DateTime
和UTC Offset。但是这些信息不足以确定时区,因为不同的时区可能具有相同的偏移量。
但是,如果您真的想要生成"2016-03-01T10:00:00-06:00"
输入,我可以提供2种方式甚至我不建议;
根据该值生成相关的DateTime
实例,将您的系统时区设置为6
小时后作为offfset部分(因为不建议使用zzz
format specifier的DateTime不相关Kind
属性)并格式化您的DateTime
;
DateTime dt = new DateTime(2016, 3, 1, 10, 0, 0);
Console.WriteLine(dt.ToString("yyyy-MM-ddTHH:mm:sszzz"));
// 2016-03-01T10:00:00-06:00
在格式化之后,根据DateTime和offset部分生成DateTimeOffset
实例;
var dto = new DateTimeOffset(dt, TimeSpan.FromHours(-6));
Console.WriteLine(dto.ToString("yyyy-MM-ddTHH:mm:sszzz"));
// 2016-03-01T10:00:00-06:00