3

我正在编写一个程序,该程序需要每小时发送一封电子邮件,但在用户本地的时间。

假设我有 2 个不同时区的用户。约翰在纽约,弗雷德在洛杉矶。服务器在芝加哥。如果我想在当地时间下午 6 点向每个用户发送电子邮件,我必须在服务器时间晚上 7 点将电子邮件发送给 John,在服务器时间下午 4 点将电子邮件发送给 Fred。

在 .NET / Sql Server 中有什么好的方法?我找到了一个包含所有时区信息的 xml 文件,因此我正在考虑编写一个脚本将其导入数据库,然后对其进行查询。

编辑:我使用“t4znet.dll”并在 .NET 端进行了所有比较。

4

3 回答 3

0

我是一名 PHP 开发人员,所以我将分享我对 PHP 的了解。我确信.NET 将包含类似的内容。

在 PHP 中,您可以获得服务器时间的时区差异 - 正如您建议您在服务器上的不同时间发送电子邮件一样。

每次添加用户时,保存他们与服务器时间的时间偏移量(或他们的时区,以防服务器时区发生变化)。

然后,当您指定更新时,有一个每小时运行一次的自动化任务(用于 LAMP 人员的 Cron)检查是否需要发送电子邮件。这样做,直到没有电子邮件可以发送。

于 2008-08-22T13:35:17.710 回答
0

你有两个选择:

  • 为每个用户将邮件操作的调整时间存储到数据库中。然后只需将服务器时间与存储时间进行比较。为避免混淆和可移植性问题,我将始终以 UTC 存储时间。因此,请在 SERVER_UTC_TIME() == storedUtcTime 时发送邮件。
  • 将每个邮件操作的本地时间存储到数据库中,然后即时转换。当 SERVER_UTC_TIME() == TO_UTC_TIME(storedLocalTime, userTimeZone) 时发送邮件。

您应该决定什么对您的应用程序最有意义。例如,如果所有用户的邮寄时间始终相同,则使用选项 (2) 更有意义。如果事件时间可以在用户之间甚至每个用户之间发生变化,那么如果您选择选项 (1),可能会使开发和调试更容易。无论哪种方式,您都需要知道用户的时区。

*这些函数调用显然是伪的,因为我不知道它们在 T-SQL 中的调用,但它们应该存在。

于 2008-08-22T15:44:23.033 回答
0

您可以通过这篇出色的文章“世界时钟和 TimeZoneInformation 类”来补充您的解决方案,我创建了一个 Web 服务,它发送了一个包含本地和接收器时间信息的文件,我所做的是修改这个类以便我可以处理这个问题它工作得非常完美,完全符合我的需要。

我认为您可以参加该课程并从“用户”表中获取他们的时区并“计算”适当的时间,我的代码是这样的;

//Get correct destination time
DateTime thedate = DateTime.Now;

string destinationtimezone = null;

//Load the time zone where the file is going
TimeZoneInformation tzi = TimeZoneInformation.FromName(this.m_destinationtimezone);

//Calculate
destinationtimezone = tzi.FromUniversalTime(thedate.ToUniversalTime()).ToString();

此类在 Windows Vista 中存在一个问题,该问题会导致“FromIndex(int index)”函数崩溃,但您可以修改代码,而不是使用该函数:

    public static TimeZoneInformation FromIndex(int index)
    {
        TimeZoneInformation[] zones = EnumZones();

        for (int i = 0; i < zones.Length; ++i)
        {
            if (zones[i].Index == index)
                return zones[i];
        }

        throw new ArgumentOutOfRangeException("index", index, "Unknown time zone index");
    }

您可以将其更改为;

    public static TimeZoneInformation FromName(string name)
    {
        TimeZoneInformation[] zones = EnumZones();

        foreach (TimeZoneInformation tzi in zones)
        {
            if (tzi.DisplayName.Equals(name))
                return tzi;
        }

        throw new ArgumentOutOfRangeException("name", name, "Unknown time zone name");
    }
于 2008-08-26T05:07:26.587 回答