我正在尝试创建一个单元测试来测试机器上时区变化的情况,因为它已被错误地设置然后更正.
在测试中,我需要能够在非本地时区创建DateTime对象,以确保运行测试的人员无论身在何处都能成功完成.
从我从DateTime构造函数中可以看到,我可以将TimeZone设置为本地时区,UTC时区或未指定.
如何使用PST等特定时区创建DateTime?
如何在不更改实际时间的情况下将预先存在的日期时间转换为UTC时间.
例:
DateTime dateTime = GetSomeDateTime(); // dateTime here is 3pm
dateTime.ToUtcDateTime() // datetime should still be 3pm
Run Code Online (Sandbox Code Playgroud) 使用下面的代码,我尝试将此datetime字符串转换为本地字符串DateTime
private DateTime ConvertToLocalTime(string datetimestring)
{
DateTime timeUtc = DateTime.Parse(datetimestring);
TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, cstZone);
return cstTime;
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的异常:
在 System.TimeZoneInfo.ConvertTime(DateTime dateTime、TimeZoneInfo sourceTimeZone、TimeZoneInfo destinationTimeZone、TimeZoneInfoOptions 标志、CachedData cachedData)
System.TimeZoneInfo.ConvertTimeFromUtc(DateTime dateTime, TimeZoneInfo destinationTimeZone)由于提供的 DateTime 没有正确设置 Kind 属性,因此无法完成转换。例如,当 Kind 属性为 时
DateTimeKind.Local,源时区必须为 TimeZoneInfo.Local。
ConvertTimeFromUtc 的示例看起来与我的代码完全相同,只是我将此字符串解析为 timeUtc:
2017-01-23T05:00:00+00:00
如果我这样调用 Parse:
DateTime.Parse(datetimestring, null, System.Globalization.DateTimeStyles.RoundtripKind);
Run Code Online (Sandbox Code Playgroud)
timeUtc.Kind.ToString()返回“本地”
那么,我该如何补救呢?时间将以 UTC 时间发送给我。
DateTime dt = new DateTime("2014-09-15T21:20:14");
System.out.println(dt);
System.out.println(dt.plusMillis(581042272).toDateTime().toLocalDateTime().toDateTime(DateTimeZone.forID("GMT")));
Run Code Online (Sandbox Code Playgroud)
dt中的时间是UTC,我想将时间设置为dt加上毫秒到GMT?但是,时间仍然打印为UTC(格林威治标准时间晚1小时).我如何设置它以便在前面一个小时?
2014-09-15T21:20:14.000+01:00
2014-09-22T14:44:16.272Z
Run Code Online (Sandbox Code Playgroud)
我知道时间正好落后一小时,因为我在格林威治标准时间15:44:16提出了这个请求