如何在.NET / Sql Server中以用户当地时间发送电子邮件?

时间:2008-08-22 13:22:31

标签: sql .net sql-server timezone

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

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

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

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

3 个答案:

答案 0 :(得分:0)

我是PHP开发人员,所以我将从PHP分享我所知道的。我确信.NET会包含类似的内容。

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

每次添加用户时,请保留服务器时间(或服务器时区更改时的时区)的时间偏差。

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

答案 1 :(得分:0)

您有两种选择:

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

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

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

答案 2 :(得分:0)

你可以用这篇优秀的文章“World Clock and the TimeZoneInformation class”来补充你的解决方案,我做了一个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");
    }