2008-08-22 28 views
3

我正在编写一个程序,需要每小时发送一次电子邮件,但是在用户本地。如何在用户本地时间在.NET/Sql Server中发送电子邮件?

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

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

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

回答

0

你有两个选择:

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

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

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

0

我是一名PHP开发人员,因此我将分享我从PHP获悉的信息。我相信.NET会包含类似的东西。

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

每次添加用户时,都要保存它们从服务器时间(或其时区以防服务器时区更改)的时间偏移量。

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

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指数)”的功能,但你可以修改代码,而不是使用功能:

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"); 
    } 
相关问题