使用日期时区



我正在编写一些代码,其中我有一个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");
}

在这两个函数中,outputNZoutputUS是相同的。这是为什么呢?

提前谢谢。

>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的文档

此方法使用从当前区域性派生的格式信息

由于您的区域性永远不会改变,因此输出也不会改变

相关内容

  • 没有找到相关文章

最新更新