C# .NET保存日期时间并完全忽略时区

C# .NET保存日期时间并完全忽略时区,c#,.net,C#,.net,也许答案很明显,我看不到,但我有一个问题,无论如何我都要冒险问 我希望允许.NET Web应用程序的用户输入日期/时间,将其存储在Oracle数据库中,并且无论他们处于哪个时区,它始终显示为用户键入的原始原始版本。因此,如果加利福尼亚州的一个用户进入下午2点,马里兰州的另一个用户进入下午2点,他们都会向日本的用户显示为下午2点。可以使用两种类型的客户端:web用户和windows客户端用户(通过web服务连接) 想象一下,我想完全打破大多数应用程序担心的所有时区智能 但我不想另存为字符串。我想要

也许答案很明显,我看不到,但我有一个问题,无论如何我都要冒险问

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

想象一下,我想完全打破大多数应用程序担心的所有时区智能

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

编辑:


基本上就是我遇到的问题

如果只存储用户输入/选择的日期时间,则它将存储为该日期时间。将有时区信息存储在它,但你是在控制你用它做什么

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

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

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

您应该始终以UTC格式(通用)存储
日期时间。当您显示它时,您可以选择任何您想要的,在您的情况下,这可以为所有用户修复,而不是基于位置

// 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);

这考虑到了诸如日光节约之类的问题,如果开始保存本地化日期,这可能会使您绊倒。

我有一个时间敏感的修复程序,指定的索引不允许我进行适当的时间跨度比较。在我的情况下,最快的解决方案是从时间中删除小时、分钟和秒,因为我比较的日期时间是午夜(00:00:00)


如果确实要放弃时区:

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

        return dateTime;
    }

相关问题:你到底遇到了什么困难?有95%的几率有一天你会深深后悔。但是实现起来很简单,只需使用用户在本地输入的时间,而不需要进行转换。如果获得字符串,则使用DateTime.Parse()。你不能在服务器上这样做,你不知道intertube从哪里开始。它是用于科学数据输入的。他们希望存储的值与输入的值完全相同。他们认为时区操作是“改变”数据。我们保留一个单独的审核跟踪,它确实关心时区。@Oded:windows客户端正在保存日期时间,时区偏移量更改存储在oracle数据库中的值。所以加利福尼亚下午2点在web服务器上显示为东部时间下午5点(你通常想让我知道)。如果我没弄错的话,这不只是字符串格式吗?我只想完全忽略时区操纵。@Rake-我会尽力澄清。基于我措辞拙劣的问题,我接受这一点作为最佳答案。这是应用程序应该做的,但我必须解决一些架构问题。另外,这是在.NET2.0中,所以TimeZoneInfo目前还不适用于我。
    public static DateTime WithoutTimeZone(this DateTime dateTime)
    {
        if (dateTime.Kind != DateTimeKind.Unspecified)
            return new DateTime(dateTime.Ticks, DateTimeKind.Unspecified);

        return dateTime;
    }