我正在尝试创建一个单元测试,以测试当机器上的时区因设置不正确而更改时的情况。

在测试中,我需要能够在非本地时区创建DateTime对象,以确保运行测试的人可以成功地这样做,而不管他们位于哪里。

从我可以从DateTime构造函数中看到,我可以将TimeZone设置为本地时区,UTC时区或未指定。

我如何创建一个日期时间与特定的时区,如PST?


当前回答

TimeZoneInfo试试。ConvertTime(dateTime, sourceTimeZone, destinationTimeZone)

其他回答

我喜欢乔恩·斯基特的回答,但我想补充一点。我不确定乔恩是否期待着ctor总是在本地时区通过。但我想把它用在本地以外的情况下。

我正在从数据库中读取值,并且我知道该数据库位于哪个时区。在ctor中,我将传入数据库的时区。但是我想知道当地时间的值。Jon的LocalTime不会返回转换为本地时区日期的原始日期。它返回转换成原始时区的日期(无论您传递给ctor的是什么)。

我认为这些属性名称清楚了…

public DateTime TimeInOriginalZone { get { return TimeZoneInfo.ConvertTime(utcDateTime, timeZone); } }
public DateTime TimeInLocalZone    { get { return TimeZoneInfo.ConvertTime(utcDateTime, TimeZoneInfo.Local); } }
public DateTime TimeInSpecificZone(TimeZoneInfo tz)
{
    return TimeZoneInfo.ConvertTime(utcDateTime, tz);
}

您必须为此创建一个自定义对象。您的自定义对象将包含两个值:

DateTime值 一个时区对象

不确定是否已经有clr提供的数据类型具有此功能,但至少TimeZone组件已经可用。

TimeZoneInfo试试。ConvertTime(dateTime, sourceTimeZone, destinationTimeZone)

对于具有特定时区(既不是本地时区,也不是UTC时区)偏移量的日期/时间,您可以使用DateTimeOffset类:

  var time = TimeSpan.Parse("9:00");
  var est = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
  var nationalDateTime = new DateTimeOffset(DateTime.Today.Ticks + time.Ticks, est.BaseUtcOffset);

我改变了乔恩斯基特回答一点网络与扩展方法。它在天蓝色上也有魔力。

public static class DateTimeWithZone
{

private static readonly TimeZoneInfo timeZone;

static DateTimeWithZone()
{
//I added web.config <add key="CurrentTimeZoneId" value="Central Europe Standard Time" />
//You can add value directly into function.
    timeZone = TimeZoneInfo.FindSystemTimeZoneById(ConfigurationManager.AppSettings["CurrentTimeZoneId"]);
}


public static DateTime LocalTime(this DateTime t)
{
     return TimeZoneInfo.ConvertTime(t, timeZone);   
}
}