我在理解如何将用户当前日期和时间与服务器时间相匹配时遇到了一些麻烦。
示例:假设我有一个用户可以自行注册的网站。一个配置文件选项是他们可以选择本地时区。为此,有一个下拉菜单,他们可以从中选择正确的时区。因此,来自中国的用户可能会选择(UTC+08:00)北京,重庆,香港,乌鲁木齐,来自洛杉矶的另一个用户将选择(UTC-07:00)山区时间(美国和加拿大)(我假设),来自巴黎的人将选择(UTC+01:00)布鲁塞尔,哥本哈根,马德里,巴黎。
Web 应用程序在美国的服务器上运行,具有特定的时区...
现在。。。所有这些用户都希望在下周五当地时区的 19:00 收到电子邮件通知!!
在这里我迷路了...对于所有这些用户来说,下周五的 19:00 肯定不是同一时间......
如何映射他们的个人资料时区,以便我的网站上运行的服务将在下周五 19:00 用户的本地时区发送电子邮件通知???
我现在处于这个阶段...使用所有时区填充下拉菜单,以便用户可以在其个人资料中选择其当前时区。
当页面加载量超过下拉列表时,将使用时区填充:
protected void Page_Load(object sender, EventArgs e)
{
ddlUserTimeZone.DataSource = GetTimeZones();
ddlUserTimeZone.DataTextField = "Name";
ddlUserTimeZone.DataValueField = "ID";
ddlUserTimeZone.DataBind();
}
public Collection<TimeZoneItem> GetTimeZones()
{
Collection<TimeZoneItem> timeZones = new Collection<TimeZoneItem>();
foreach (var timeZoneInfo in TimeZoneInfo.GetSystemTimeZones())
{
timeZones.Add(new TimeZoneItem
{
TimeZoneName = timeZoneInfo.DisplayName,
TimeZoneID = timeZoneInfo.Id
});
}
return timeZones;
}
public struct TimeZoneItem
{
public string TimeZoneName { get; set; }
public string TimeZoneID { get; set; }
}
现在,你们能帮忙将配置文件时区与当前时间匹配,以便在正确的时间发送电子邮件吗?
提前感谢!
您只是在设置此服务吗? 如果是这样,请在协调世界时(UTC 或祖鲁语)时间(而不是本地时区)上运行 Web 服务器和数据库服务器。 如果你这样做,一切都会更容易管理。我以艰难的方式学到了这一点。
UTC过去被称为格林威治标准时间;它是时区+00:00。对于夏令时,它不会像美国和欧洲当地时间那样改变。
这个时区的事情很痛苦,值得做对。 一些国家/地区有半小时时区。
无论如何,一旦您知道每个用户的首选时区以及她想要通知的时间,您就可以将时间从本地转换为 UTC 并存储它。
尝试这样的事情,将用户的小时和分钟转换为 UTC。 (时区转换需要日期,因为它们取决于夏令时规则。还有一个复杂情况。在时区从夏令时切换到标准时区的那一天,反之亦然,通知的 UTC 时间将发生变化。大多数人通过在发送每个通知时重新计算下一个通知(明天的通知)的 UTC 日期和时间来处理此问题。请考虑此代码。
TimeZoneInfo userLocal = ;//user's time zone
int hour = ;//whatever the user wants
int minute = ;//whatever the user wants
DateTime tomorrow = DateTime.Now.AddDays(1);
int year = tomorrow.Year;
int month = tomorrow.Month;
int day = tomorrow.Day;
DateTime notificationTime = new DateTime(year,month,day,
hour,minute,0,
DateTimeKind.Unspecified);
DateTime tomorrowNotificationTime = TimeZoneInfo.ConvertTimeToUtc(
notificationTime,userLocal);
这应该会让你获得明天以明天日期的正确时区传递此用户通知所需的 UTC 时间。
理想情况下,DateTime 应以 UTC 格式存储在服务器上。
您的服务器上有以下数据
- 用户的时区信息。
- 用户需要通知的时间。
-
服务器上的当前本地时间。
// Convert current local server time to UTC. var serverUtc = DateTime.UtcNow; // Convert UTC time to users local time. This gives you the date and time as per the user. var userTimeZone = TimeZoneInfo.GetSystemTimeZones()[0]; // just an example. Replace with actual value. var userCurrentTime = TimeZoneInfo.ConvertTime(serverUtc, userTimeZone); /* add a day to userCurrentTime till its Friday. Add/subtract minutes till its 7:00PM. */ var expectedNotificationTimeUtc = TimeZoneInfo.ConvertTimeToUtc(userCurrentTime, userTimeZone); /* 1. store the expectedNotificationTimeUtc as the time you want to send the email. 2. your service can check for users their expectedNotificationTimeUtc and if the UtcNow is within an acceptable range of the that time, send the email. */