.NET保存DateTime并完全忽略时区

时间:2011-09-10 21:09:45

标签: c# .net

也许答案是如此明显,我没有看到,但我有一个问题,无论如何我都会冒险。

我想允许.NET Web应用程序的用户输入日期/时间,将其存储在Oracle数据库中,无论他们在哪个时区,它始终显示为输入的原始原始版本。用户。因此,如果加利福尼亚州的一个用户进入下午2点,而马里兰州的另一个用户进入下午2点,则他们都会向日本的用户显示为2PM。可以使用两种类型的客户端:Web用户和Windows客户端用户(通过Web服务连接)。

想想它就像我想彻底打破大多数应用程序所担心的所有时区智能。

我不想保存为字符串。我想要一个可以添加/删除小时和分钟的日期时间。

编辑:

This基本上是我遇到的确切问题。

4 个答案:

答案 0 :(得分:9)

您应始终以UTC格式(通用)存储DateTime。当您显示它时,您可以选择您想要的timezone,在您的情况下,可以为所有用户修复,而不是根据位置。

// when recording date time
DateTime utcDateTime = DateTime.UtcNow;

// parse DateTime back out from string
DateTime utcDateTime = DateTime.SpecifyKind(DateTime.Parse(dateStr),
                                            DateTimeKind.Utc);

// localized DateTime
DateTime localDate = utcDateTime.ToLocalTime();

// fixed DateTime based on timezone
string timeZoneKey = "New Zealand Standard Time";
TimeZoneInfo timeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneKey);
DateTime nzlocalDate = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, timeZone);

这会考虑日常节省的费用,如果开始保存本地化日期,可能会让您失望。

答案 1 :(得分:0)

如果你只是存储用户输入/选择的DateTime,那么它将被存储为那样。将存储时区信息,但您可以控制使用它进行操作。

例如,当您想将其输出到屏幕/文件等时,您需要将其格式化为字符串。如果您将this ToString overloadCultureInfo.InvariantCulture一起使用,则应忽略当前文化并按日期输出日期:

DateTime date = DateTime.Now;
string output = date.ToString("d", CultureInfo.InvariantCulture);

其他操作需要不同的处理,但您需要指定每种情况下会发生什么。

答案 2 :(得分:0)

我有一个时间敏感的修正,而且SpecifyKind不允许我进行适当的TimeSpan比较。在我的情况下,最快的解决方案是简单地删除当时的小时,分​​钟和秒,因为我与之比较的DateTime是在午夜(00:00:00),

DateTime eventDateTime = (DateTime)row["event_date"];
eventDateTime = eventDateTime.AddHours(-1 * eventDateTime.Hour).AddMinutes(-1 * eventDateTime.Minute).AddSeconds(-1 * eventDateTime.Second);

答案 3 :(得分:0)

如果你真的想放弃时区:

    public static DateTime WithoutTimeZone(this DateTime dateTime)
    {
        if (dateTime.Kind != DateTimeKind.Unspecified)
            return new DateTime(dateTime.Ticks, DateTimeKind.Unspecified);

        return dateTime;
    }