Как правило, манипуляции с часовым поясом невозможно выполнить напрямую в классическом ASP.
Однако, если у вас есть полный контроль над сервером, на котором выполняется код, вы можете установить COM-компонент, написанный на языке, который имеет поддержку часового пояса, а затем использовать этот компонент из вашего классического ASP окружающая среда.
Например, вы можете написать следующий компонент в .NET с C #:
using System;
using System.Runtime.InteropServices;
namespace TimeZoneInfoCom
{
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDispatch)]
[Guid("E0C70A94-352D-4C0B-8C2E-8066C88565C5")]
public class TimeZoneConverter
{
public DateTime NowInZone(string timeZoneId)
{
return TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.UtcNow, timeZoneId);
}
public DateTime Convert(DateTime dateTime, string sourceZoneId, string targetZoneId)
{
TimeZoneInfo sourceTimeZone = TimeZoneInfo.FindSystemTimeZoneById(sourceZoneId);
TimeZoneInfo targetTimeZone = TimeZoneInfo.FindSystemTimeZoneById(targetZoneId);
return TimeZoneInfo.ConvertTime(dateTime, sourceTimeZone, targetTimeZone);
}
}
}
Затем вы скомпилируете это, скопируете DLL на свой сервер и зарегистрируете ее как компонент COM (используя RegAsm.exe
).
Тогда вы могли бы назвать это на своей странице Classic ASP, например:
<html>
<body>
Server Time: <%= Now() %><br>
<br>
<%
Dim tzconverter
Set tzconverter = Server.CreateObject("TimeZoneInfoCom.TimeZoneConverter")
%>
US Pacific Time: <%= tzconverter.NowInZone("Pacific Standard Time") %><br>
US Mountain Time: <%= tzconverter.NowInZone("Mountain Standard Time") %><br>
US Central Time: <%= tzconverter.NowInZone("Central Standard Time") %><br>
US Eastern Time: <%= tzconverter.NowInZone("Eastern Standard Time") %><br>
UTC: <%= tzconverter.NowInZone("UTC") %><br>
<br>
Conversion Example:
<%
Dim originalTime, convertedTime
originalTime = #12/31/2014 00:00:00#
convertedTime = tzconverter.Convert(originalTime, "UTC", "Tokyo Standard Time")
Response.Write(convertedTime)
%>
<%
' Don't forget to destroy the com object!
Set tzconverter = Nothing
%>
</body>
</html>
Если вы получаете сообщение об ошибке «Компонент ActiveX не может создать объект», убедитесь, что вы установили «Включить 32-разрядные приложения» на True
в IIS в дополнительных настройках пула приложений.
Что касается SQL Server - при поиске вы можете найти несколько сообщений, показывающих способы управления временем в SQL Server с помощью сложных хранимых процедур, которые либо имеют фиксированные смещения, правила фиксированного часового пояса, либо полагаются на таблицы данные часового пояса. Я обычно советую против любого из этих подходов, потому что они слишком хрупкие.
- Фиксированные смещения плохие, поскольку они не учитывают переход на летнее время.
- Фиксированные правила плохие, потому что правила часового пояса могут (и могут) меняться. Редактирование хранимых процедур, чтобы не отставать от этих изменений, слишком хрупко (ИМХО).
- Ведение таблиц данных о часовых поясах немного лучше, но обычно я считаю, что эти таблицы не поддерживаются должным образом. Если вы идете по этому маршруту, обязательно установите процедуру периодического обновления таблиц.