我正在写一程序,需要发送了一封电子邮件每小时,但在时间当地用户使用。

说我有2个用户在不同时区。约翰是在纽约和弗雷德是在洛杉矶。服务器是在芝加哥。如果我想要发一封电子邮件午6时地向每个用户,我得发送电子邮件向约翰在7点服务时间和弗莱德在下午4点服务时间。

什么是好的做法,以此。NET/Sql服务器?我已经找到了一个xml文件的所有次区域信息,因此我正在考虑编写脚本,将其导入数据库,然后,查询它。

编辑: 我用"t4znet.dll"并没有所有的比较。净面。

有帮助吗?

解决方案

你有两个选择:

  • 储存的调整时对邮件的行动进入数据库,用于各个用户。然后就比较服务器的时间与存储时间。为了避免混淆和可携带性问题,我要存储所有次在UTC。因此,发送邮件当SERVER_UTC_TIME()==storedUtcTime.
  • 存储本地时间为每个邮件的行动进入数据库、然后转换上。发邮件的时候SERVER_UTC_TIME()==TO_UTC_TIME(storedLocalTime,userTimeZone).

你应该决定什么最有意义。例如,如果邮寄时间总是相同的,为所有用户,这使得更有意义去与选项(2)条。如果该事件的时间可以更改用户之间甚至是每个用户,它可能使发展和调试容易,如果你选择选项(1)条。不管怎样你会需要知道的用户的时区。

*这些功能的电话显然是伪的,因为我不知道他们的调用在T-SQL,但他们应该存在。

其他提示

I'm a PHP developer所以我会分享我知道从PHP.我敢肯定。净将包括类似的东西。

在PHP你可以得到的时区的差异为服务器的时间-因为你已经建议的,你想发送电子邮件在不同时在服务器上。

每次你添加一个用户保存自己的时间偏离服务器时(或他们的时区在情况的时区服务器的变化)。

然后,当你指定一个更新,有的自动化任务(Cron灯的人)运行每一个小时查看如果一个电子邮件需要的发送。这样做,直到没有电子邮件离开发送。

你可以补充你的解决方案与这个优秀的文章"世界钟和TimeZoneInformation类"我做了一个服务于发送一个文件与信息,包括地方和接收时间,我所做的是要修改此类的,所以我可以处理这一问题,它的工作完美的,正是因为我需要。

我认为你可以把这种类和获得从表"用户"的时区,他们和"计算"的适当时间,我的代码就像这;

//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于崩溃的"置(int指数)"功能,但你可以修改的代码,而不是使用功能:

    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");
    }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top