Классический ASP - время сервера против местного времени - PullRequest
2 голосов
/ 31 марта 2012

У меня есть классическое ASP-приложение, которое я работаю с отсечкой по дате.Мой сервер находится по центральному времени, а я по восточному.Происходит следующее: мое приложение думает, что это на час раньше, а мои отключения на час позже.Я уверен, что они будут на 2 часа раньше, если пользователь будет по тихоокеанскому времени.

Я пытаюсь выяснить, есть ли способ либо

  1. сообщить серверучтобы показать мне местное время, когда вы выполняете GetDate () для SQL или Now () в ASP
  2. , найдите способ сделать смещение, которое я могу запустить при первой загрузке страницы и использовании по мере необходимости.

Я пробовал javascript на стороне сервера, он также возвращает Центральное время.Любая помощь будет принята с благодарностью!Заранее спасибо!

Деннис


ОБНОВЛЕНИЕ - 4/11/12 @ 1:12 pm:


Я думаю, что нашел решение длямое приложение, но оно не будет работать вообще.У меня есть географические данные для местоположения, с которым я работаю - почтовый индекс.Из этого я могу получить часовой пояс - он не будет работать должным образом для пользователей в других часовых поясах, смотрящих на местоположение, но это не имеет значения для моего приложения, поскольку мне просто нужно сосредоточиться на времени окончания для этого местоположения.

Это другой (-ые) способ (-ы), который я обнаружил, предоставил ДжонБ ниже (в частности, # 4).Спасибо всем.http://www.webmasterworld.com/forum47/600.htm (внизу)


Ответы [ 5 ]

3 голосов
/ 01 апреля 2012

EDIT

Я пробовал javascript на стороне сервера, он также возвращает центральное время.

Вы хотели сказать на стороне клиента JavaScript? Вам определенно нужно использовать клиентский скрипт, чтобы получить время устройства пользователя (не серверная скрипт).


Вы должны прочитать это:

Учебник по работе с несколькими часовыми поясами:

1) Убедитесь, что на вашем сервере баз данных установлены правильные дата / время в своем часовом поясе. Правильно учитывать летнее время в своем месте. Настройте сервер на автоматическое выполнение этого.

2) Создайте таблицу в своей базе данных с часовыми поясами и их смещением от UTC (GMT).

3) Всегда хранить Now() Дата / Время в UTC. У каждого поставщика базы данных должна быть функция UTC Дата / Время Now() (т. Е. SYSUTCDATETIME() для SQL Server). Таким образом, все времена хранятся в универсальном формате, не зависящем от места, где сидит пользователь. Звоните Now() из вашей базы данных, а не из клиента, потому что мобильные устройства могут быть где угодно, но ваш сервер баз данных остается в одном месте.

4) Пользователь может ввести свой часовой пояс и сохранить его в своей базе данных.

5) При отображении даты / времени, сохраненных в UTC, обратно пользователю, конвертируйте дату / время UTC обратно в часовой пояс пользователя, используя смещение часового пояса пользователя. SQL Server делает это немного проще с datetimeoffset.

6) Если пользователь устанавливает будильник, попросите его ввести триггер Дата / Время в своем часовом поясе. Таким образом, пользователь может изменить свой часовой пояс, если он перемещается. Кроме того, если правила часовых поясов меняются, вы можете просто исправить таблицу часовых поясов (# 2), и тогда будильник будет срабатывать правильно. В вашем коде, чтобы проверить наличие сигнала тревоги, преобразуйте время запуска в UTC, а затем сравните с временем сервера в формате UTC (т.е. SYSUTCDATETIME()).

7) Летнее время сложно! (см. 1-ую ссылку)

2 голосов
/ 08 марта 2015

Как правило, манипуляции с часовым поясом невозможно выполнить напрямую в классическом 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 с помощью сложных хранимых процедур, которые либо имеют фиксированные смещения, правила фиксированного часового пояса, либо полагаются на таблицы данные часового пояса. Я обычно советую против любого из этих подходов, потому что они слишком хрупкие.

  • Фиксированные смещения плохие, поскольку они не учитывают переход на летнее время.
  • Фиксированные правила плохие, потому что правила часового пояса могут (и могут) меняться. Редактирование хранимых процедур, чтобы не отставать от этих изменений, слишком хрупко (ИМХО).
  • Ведение таблиц данных о часовых поясах немного лучше, но обычно я считаю, что эти таблицы не поддерживаются должным образом. Если вы идете по этому маршруту, обязательно установите процедуру периодического обновления таблиц.
0 голосов
/ 18 сентября 2018

Новое решение старого вопроса ...

Мы только что столкнулись с этой проблемой при перемещении сервера из «восточного стандартного времени» в «utc» со всеми нашими классическими приложениями asp. Но мы используем SQL Server 2017.

И, если вы используете SQL Server 2016+, вы можете использовать ключевое слово new "at time zone" .

Получите текущее "смещение" из этого запроса:

select datediff(hour, GETUTCDATE() at time zone 'eastern standard time', GETUTCDATE()) as offset

Затем используйте это смещение для обработки всех ваших дат в коде ASP с помощью таких функций, как:

function fromUTC(dt)
    fromUTC = dateadd("h", tzOFFSET, dt)
end function

function toUTC(dt)
    toUTC = dateadd("h", -1 * tzOFFSET, dt)
end function

function getNow
    getNow = fromUTC(now)
end function

Вы можете заменить все «сейчас» на «getNow» в вашем коде.

Предупреждение: это смещение фиксируется в соответствии с текущей датой. Если вам нужно обрабатывать даты из разных дневных периодов, вы можете использовать синтаксис «в часовом поясе» непосредственно в запросе SQL, например:

DECLARE @timezone NVARCHAR(100) = N'eastern standard time'
SELECT 
    u.name, 
    u.last_visit   at time zone @timezone as last_visit_tz,
    u.date_created at time zone @timezone as date_created_tz
FROM users u
0 голосов
/ 31 марта 2012

Я думаю, что если вы выберете нужную вам опцию ниже, а затем поместите в верхней части своей страницы, она будет по умолчанию указывать это местоположение вместо сервера - http://msdn.microsoft.com/en-us/library/ms524330(v=vs.90).aspx

' This file does not need @LCID or @CODEPAGE and 
'  it does not need to be saved in UTF-8 format because  
'  there are no literal strings that need formatting or encoding. 

Response.Codepage = 65001 
Response.Charset = "utf-8" 

' See what happens when you uncomment the lines below. 
'Response.Codepage = 1252 
'Response.Charset = "windows-1252" 

ShowDateTimeCurrency 1033, "North America" 
ShowDateTimeCurrency 1041, "Japan" 
ShowDateTimeCurrency 1049, "Russia" 
ShowDateTimeCurrency 1031, "Germany" 
ShowDateTimeCurrency 1025, "Saudi Arabia" 
ShowDateTimeCurrency 1081, "India" 
ShowDateTimeCurrency 2052, "China" 
ShowDateTimeCurrency 1042, "Korea" 

Sub ShowDateTimeCurrency(iLCID, sLocale) 
  Response.LCID = iLCID 
  Response.Write "<B>" & sLocale & "</B><BR>" 
  Response.Write FormatDateTime(Date, 1) & "<BR>" 
  Response.Write FormatDateTime(Time, 3) & "<BR>" 
  Response.Write FormatCurrency(1000) & "<BR>" 
  Response.Write FormatNumber(50, 3, 0, 0, -1) & " & " & FormatNumber(.02, 3, 0, 0, -1) & "<BR><BR>" 
End Sub

Посмотрите здесь - http://msdn.microsoft.com/en-us/library/ms524330(v=vs.90).aspx

или другим способом было бы использовать функцию добавления даты для времени

Пожалуйста, отметьте как ответ, если это поможет спасибо

0 голосов
/ 31 марта 2012

Получение часового пояса пользователя

http://www.pageloom.com/automatic-timezone-detection-with-javascript

Из того, что я понимаю об этом коде JavaScript, он очень точный и сможет вернуть смещение от UST, соответствующего имени часового пояса базы данных Olson, и обработать проблему перехода на летнее время (например, -5: 00, Америка / Нью-Йорк, правда).

Единственное препятствие, с которым вы столкнетесь после того, как этот код заработал на вашей html-странице, - это получение этих значений в asp, а затем в sql, если это то, что вам нужно. Я добился этого, отправив эти значения в виде $ .post с помощью JQuery. Я думаю, что это самый простой способ сделать это. Я полагаю, что другие альтернативы используют команду AJAX или куки.

После того, как я получил значения из кода JavaScript на сервер, я сохранил их как переменные сеанса, чтобы они изменились, если бы пользователь на моем сайте вошел в систему из другого часового пояса, чем обычно. Однако они также могут быть легко сохранены в базе данных.

//replace this comment with the most updated timezonedetect code from that first link
var timezone = jstz.determine_timezone();
var tzoffset = timezone.offset();
var tzname = timezone.name();
var tzdst = timezone.dst();
$.post("tzdetect.asp", { tzoffset: tzoffset, tzname: tzname, tzdst: tzdst } );

Затем вам нужно настроить принимающий файл tzdetect.asp на сервере для хранения часового пояса после его отправки.

Работа с часовым поясом, если он у вас есть

Эта статья имеет хорошее решение вашей проблемы: http://www.codeproject.com/Articles/31146/SQL-2005-Time-Zone-Conversion-Functions

Подход заключается в создании скалярной функции под названием NEW_TIME, который принимает три параметра:

  • дата конвертации
  • исходное значение часового пояса
  • преобразование часового пояса

и функция возвращает преобразованное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...