我正在编写一些代码,其中我有一个UTC的DateTime,我需要将其显示为LocalTime,其中我有一个两个时区的文化对象。
这是我的代码:
public void CultureDateTimeLocalTime()
{
DateTime dateTimeUtcNow = DateTime.UtcNow;
DateTime convertedDate = DateTime.SpecifyKind(dateTimeUtcNow, DateTimeKind.Utc);
DateTime dateTimeLocalTime = convertedDate.ToLocalTime();
String format = "MM/dd/yyyy hh:mm:sszzz";
string localTime = dateTimeLocalTime.ToString(format);
CultureInfo cultureNZ = new CultureInfo("en-NZ");
CultureInfo cultureUS = new CultureInfo("en-US");
DateTime DateTimeNZ;
bool parseNZ = DateTime.TryParse(localTime, cultureNZ, DateTimeStyles.None, out DateTimeNZ);
string outputNZ = DateTimeNZ.ToString("F");
DateTime DateTimeUS;
bool parseUS = DateTime.TryParse(localTime, cultureUS, DateTimeStyles.None, out DateTimeUS);
string outputUS = DateTimeUS.ToString("F");
}
public void CultureDateTimeLocalTime2()
{
DateTime dateTimeUtcNow = DateTime.UtcNow;
DateTime convertedDate = DateTime.SpecifyKind(dateTimeUtcNow, DateTimeKind.Utc);
DateTime dateTimeLocalTime = convertedDate.ToLocalTime();
String format = "MM/dd/yyyy hh:mm:sszzz";
string localTime = dateTimeLocalTime.ToString(format);
CultureInfo cultureNZ = new CultureInfo("en-NZ");
CultureInfo cultureUS = new CultureInfo("en-US");
DateTime DateTimeNZ = DateTime.ParseExact(localTime, format, cultureNZ.DateTimeFormat);
string outputNZ = DateTimeNZ.ToString("F");
DateTime DateTimeUS = DateTime.ParseExact(localTime, format, cultureUS.DateTimeFormat);
string outputUS = DateTimeUS.ToString("F");
}
在这两个函数中,outputNZ
和outputUS
是相同的。这是为什么呢?
提前谢谢。
>CultureInfo
包含用于设置特定区域性的日期、时间和数字格式的规则。没有关于该区域性的时区的规则,因为对于大多数区域性和时区,没有一对一的对应关系,因此当日期格式化为字符串时,您不能使用CultureInfo
神奇地考虑时区。
您需要的是新西兰TimeZoneInfo
:
var nzTimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("New Zealand Standard Time");
var utcNow = DateTime.UtcNow;
var nzNow = TimeZoneInfo.ConvertTimeFromUtc(utcNow, nzTimeZoneInfo);
var outputNz = nzNow.ToString("F", CultureInfo.GetCultureInfo("en-NZ"));
您可以使用相同的逻辑转换为美国时区,但很明显,您无法从CultureInfo
推断时区,因为美国有很多时区,您必须决定使用哪个时区。
此外,在使用日期和时间时,您应该只在最后一步中转换为字符串格式。您的代码碰巧有效,因为您仔细控制了用于往返字符串的格式,但这种往返是不必要的,我已经修复了许多错误,其中此往返代码对计算机的区域设置有一个隐含的假设,当代码在另一个环境中执行时并不总是正确的。
免责声明:我只用第二种方法对此进行了测试。
两种方法都解析为DateTime
但您使用相同的ToString
输出,您可以使用 DateTimeFormatInfo.LongDatePattern
string outputNZ = DateTimeNZ.ToString(cultureNZ.DateTimeFormat.LongDatePattern);
string outputUS = DateTimeUS.ToString(cultureUS.DateTimeFormat.LongDatePattern);
// or string outputUS = DateTimeUS.ToString(cultureUS.DateTimeFormat);
IDEOne 示例
来自DateTime.ToString
的文档
此方法使用从当前区域性派生的格式信息
由于您的区域性永远不会改变,因此输出也不会改变