:: Visual Foxpro, Foxpro for DOS
Нужна функция получения даты в формате UTC/GMT, как на javascript. Т.е. вида Wed, 21 Oct 2015 07:28:00 GMT
kornienko_ru
Автор

Сообщений: 235
Откуда: Владивосток
Дата регистрации: 06.09.2015
Хотелось найти готовое отлаженное решение. Но пока не увидел. Может из стариков, кто сталкивался с получением такой даты. Спецификацию нашел здесь www.rfc-editor.org. Если такого еще не было, то придётся делать.... Выглядеть должно так:
Wed, 21 Oct 2015 07:28:00 GMT
Ratings: 0 negative/0 positive
Re: Нужна функция получения даты в формате UTC/GMT, как на javascript. Т.е. вида Wed, 21 Oct 2015 07:28:00 GMT
PaulWist

Сообщений: 14659
Дата регистрации: 01.04.2004
Получить UTC время из локального

PS Эх piva, piva какая светлая голова.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено 2 раз(а). Последнее : PaulWist, 18.04.24 15:49
Ratings: 0 negative/0 positive
Re: Нужна функция получения даты в формате UTC/GMT, как на javascript. Т.е. вида Wed, 21 Oct 2015 07:28:00 GMT
akvvohinc

Сообщений: 4261
Откуда: Москва
Дата регистрации: 11.11.2008
kornienko_ru
Выглядеть должно так:
Wed, 21 Oct 2015 07:28:00 GMT
Это то, что на выходе.
А что на входе?

Я так понимаю, что проблема не в том, чтобы на основе некоторого значения даты/времени получить строку в таком формате - это несложно.
Значит, проблема может быть только в том, чтобы привести это значение к нулевой зоне (GMT).

А поэтому для преобразования недостаточно знать некоторое значение даты/времени.
Надо знать ещё и для какой временной зоны это значение задано.

Если временная зона известна, то получить дату/время для UTC+0 (GMT) проблем, я полагаю, нет.
А если должна использоваться зона текущего компа, то она определяется с помощью
DECLARE INTEGER GetTimeZoneInformation IN kernel32 STRING @TZInfo

Сейчас, при наличии функции CTOBIN(), то же самое можно реализовать попроще.



Исправлено 1 раз(а). Последнее : akvvohinc, 18.04.24 18:25
Ratings: 0 negative/0 positive
Re: Нужна функция получения даты в формате UTC/GMT, как на javascript. Т.е. вида Wed, 21 Oct 2015 07:28:00 GMT
akvvohinc

Сообщений: 4261
Откуда: Москва
Дата регистрации: 11.11.2008
Функция, возвращающая количество секунд, на которое текущее время компа опережает время по UTC+0 (GMT).
Для Москвы возвращает 10800 в любой день, если в настройках компа не стоит галка "Автоматический переход на летнее время".

Если из текущих даты/времени компа вычесть это количество секунд, то получим время для UTC+0 (GMT)
FUNCTION pcdt
LOCAL ret,tzinfo,ret_tz,bias
************ ************ ************ ************ ************ ************
** Taken from MSDN HOWTO: Obtain Time Zone Information in Visual FoxPro
** Article KB194576
************ ************ ************ ************ ************ ************
* the definition for TIME_ZONE_INFORMATION is:
*
*typedef struct _TIME_ZONE_INFORMATION { // tzi
* LONG Bias;
* WCHAR StandardName[ 32 ];
* SYSTEMTIME StandardDate;
* LONG StandardBias;
* WCHAR DaylightName[ 32 ];
* SYSTEMTIME DaylightDate;
* LONG DaylightBias;
*} TIME_ZONE_INFORMATION;
* buffer to receive TIME_ZONE_INFORMATION
m.tzinfo = REPL(0h00,172)
DECLARE INTEGER GetTimeZoneInformation IN kernel32 STRING @TZInfo
m.ret_tz = GetTimeZoneInformation(@tzinfo)
m.ret = 0
IF m.ret_tz>-1
* GetTimeZoneInformation закончилась без ошибки
m.bias = CTOBIN(SUBSTR(m.tzinfo,1,4),'sr') && смещение в минутах (UTC+3 = -180 минут)
DO CASE
CASE m.ret_tz=0
* не надо ничего добавлять
CASE m.ret_tz=1
* надо добавить StandardBias
m.bias = m.bias+CTOBIN(SUBSTR(m.tzinfo,85,4),'sr')
CASE m.ret_tz=2
* надо добавить DaylightBias
m.bias = m.bias+CTOBIN(SUBSTR(m.tzinfo,169,4),'sr')
ENDCASE
m.ret = m.ret-m.bias*60
ELSE
* добавить обработку ошибки при определении TimeZone
ENDIF
RETURN m.ret



Исправлено 1 раз(а). Последнее : akvvohinc, 18.04.24 18:53
Ratings: 0 negative/1 positive
Re: Нужна функция получения даты в формате UTC/GMT, как на javascript. Т.е. вида Wed, 21 Oct 2015 07:28:00 GMT
kornienko_ru
Автор

Сообщений: 235
Откуда: Владивосток
Дата регистрации: 06.09.2015
Спасибо конечно, но задача немного другая. Я имел в виду только формат, а не переход с летнего или зимнего времени. У нас его слава богу нет, и я думаю, что больше не будет. А если будет, то я обычно закладывал простое условие без всяких declare. Например, летом отнимал одно количество часов, зимой другое. Кстати сейчас для Владивостока применял бы примерно такую конструкцию:
*** Владивосток +10 часов от UTC 00:00:00
hVladivostok=10
UTCtime = datet()-hVladivostok*3600
Имелось в виду, что, например, на входе {^2015-10-21 7:28a}, на выходе — "Wed, 21 Oct 2015 07:28:00 GMT". Наверное, такое еще никто не фоксе не делал. Функция нужна для управления куками.... Сделал же http-сервер, со скриптами на prg. Сейчас переписываю, то что было на MS WSH/Jscript на чистый prg. Это целый комплекс по расчетам, печати или отправки на email квитанций с личными кабинетами для TCЖ. Не такой уж он большой и сложный. Просто сделал когда-то для пользы и интереса, как хобби.... бесплатно.
Ratings: 0 negative/0 positive
Re: Нужна функция получения даты в формате UTC/GMT, как на javascript. Т.е. вида Wed, 21 Oct 2015 07:28:00 GMT
akvvohinc

Сообщений: 4261
Откуда: Москва
Дата регистрации: 11.11.2008
kornienko_ru
Имелось в виду, что, например, на входе {^2015-10-21 7:28a}, на выходе — "Wed, 21 Oct 2015 07:28:00 GMT". Наверное, такое еще никто не фоксе не делал.
Может, именно такое никто и не делал, но задача-то элементарная, даже если решать её в лоб:
1) CDOW() возвращает название дня недели (берем первые 3 символа)
2) DAY() возвращает день месяца
3) CMONTH(), возвращает название месяца (берем первые 3 символа)
4) YEAR() возвращает год
5) TTOC() или TIME() позволяет получить время

Ну, в общем как-то так:
dt = DATETIME()
? LEFT(CDOW(dt),3)+', '+TRAN(DAY(dt))+' '+LEFT(CMONTH(dt),3)+' '+TRAN(YEAR(dt))+' '+LEFT(TIME(dt),8)+' GMT'

А теперь желающие могут заняться оптимизацией (ускорением).



Исправлено 3 раз(а). Последнее : akvvohinc, 19.04.24 03:12
Ratings: 0 negative/1 positive
Re: Нужна функция получения даты в формате UTC/GMT, как на javascript. Т.е. вида Wed, 21 Oct 2015 07:28:00 GMT
kornienko_ru
Автор

Сообщений: 235
Откуда: Владивосток
Дата регистрации: 06.09.2015
Супер. И по моему это наиболее оптимальный вариант.
Вам плюсик.

Как раз смотрел в помощи эти функции cdow(now) и cmont(now), проверял правильно ли они выводят сокращения дня недели и месяца, а вы уже написали....

Проверил. Всё работает отлично. Вот такая функция получилась
func DtoUTC
lpara dt,tz
if type("m.tz")="N"
dt=m.dt-m.tz*3600
endi
retu left(cdow(m.dt),3)+', '+tran(day(m.dt))+' '+left(cmon(m.dt),3)+' '+tran(year(m.dt))+' '+left(time(m.dt),8)+' GMT'



Исправлено 3 раз(а). Последнее : kornienko_ru, 19.04.24 05:10
Ratings: 0 negative/0 positive
Re: Нужна функция получения даты в формате UTC/GMT, как на javascript. Т.е. вида Wed, 21 Oct 2015 07:28:00 GMT
akvvohinc

Сообщений: 4261
Откуда: Москва
Дата регистрации: 11.11.2008
kornienko_ru
И по моему это наиболее оптимальный вариант.
Возможно.

Но можно рассмотреть и более экзотические способы, например, такой:
Почти все требуемые компоненты (кроме дня недели) выводятся при настройке SET DATE LONG одной функцией
? TTOC(DATETIME())

Далее остается только "поработать" над строкой вывода.
Правда, название месяца выводится в соответствии с локалью системы, то есть по-русски при русской локали.
Да и в плане скорости этот способ, конечно, будет прилично уступать.
Ratings: 0 negative/1 positive
Re: Нужна функция получения даты в формате UTC/GMT, как на javascript. Т.е. вида Wed, 21 Oct 2015 07:28:00 GMT
Владимир Максимов

Сообщений: 14103
Откуда: Москва
Дата регистрации: 02.09.2000
Есть небольшое замечание

Если используют локализованные Run-Time библиотеки, например, для русского языка VFP9rrus.dll, то функции, возвращающие текст, будут возвращать этот текст именно на русском языке.

Т.е. это в среде разработки CDOW() вернет "Wednesday", а в готовом EXE эта же функция вернет "Среда". Название дня недели, но на русском

Поэтому, такие "текстовые" функции лучше не использовать, а применять собственные функции, где по номеру дня недели вернуть нужный текст на нужном языке



Исправлено 1 раз(а). Последнее : Владимир Максимов, 19.04.24 10:07
Ratings: 0 negative/1 positive
Re: Нужна функция получения даты в формате UTC/GMT, как на javascript. Т.е. вида Wed, 21 Oct 2015 07:28:00 GMT
akvvohinc

Сообщений: 4261
Откуда: Москва
Дата регистрации: 11.11.2008
Владимир Максимов
Если используют локализованные Run-Time библиотеки, например, для русского языка VFP9rrus.dll, то функции, возвращающие текст, будут возвращать этот текст именно на русском языке.
Понятно.

Но поскольку мы начали писать приложения ещё до "русификации" Фокса, то и позже уже не имело большого смысла пользоваться этими библиотеками - все нужные функции уже были написаны и менять кучу исходников желающих не нашлось. ))

Но ТС, скорее всего, придется дополнительно "переводить" с русского.



Исправлено 1 раз(а). Последнее : akvvohinc, 19.04.24 15:12
Ratings: 0 negative/1 positive
Re: Нужна функция получения даты в формате UTC/GMT, как на javascript. Т.е. вида Wed, 21 Oct 2015 07:28:00 GMT
sphinx

Сообщений: 31402
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Все пропустил. Но Сергею однозначно плюс и :hi:


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Нужна функция получения даты в формате UTC/GMT, как на javascript. Т.е. вида Wed, 21 Oct 2015 07:28:00 GMT
of63

Сообщений: 25406
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Тоже было нужно для интернетовкого чего-то, просто тихо наложу, что умею


Исправлено 1 раз(а). Последнее : Joys, 20.04.24 05:26
Ratings: 0 negative/0 positive
Re: Нужна функция получения даты в формате UTC/GMT, как на javascript. Т.е. вида Wed, 21 Oct 2015 07:28:00 GMT
of63

Сообщений: 25406
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Блин, в спойлер код сложите пож., если можно... упустил из под контроля (забыл, тупанул, зевнул), нескромно получилось
Ratings: 0 negative/0 positive
Re: Нужна функция получения даты в формате UTC/GMT, как на javascript. Т.е. вида Wed, 21 Oct 2015 07:28:00 GMT
alex;

Сообщений: 2961
Откуда: Москва
Дата регистрации: 23.11.2004
of63
Блин, в спойлер код сложите пож., если можно... упустил из под контроля (забыл, тупанул, зевнул), нескромно получилось
так есть же кнопка "редактировать" сообщение




Исправлено 1 раз(а). Последнее : alex;, 19.04.24 22:01
Ratings: 0 negative/0 positive
Re: Нужна функция получения даты в формате UTC/GMT, как на javascript. Т.е. вида Wed, 21 Oct 2015 07:28:00 GMT
of63

Сообщений: 25406
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
[attachment 36796 .jpg]а у меня нет чё-то!

Тебе продставить скрин? ... поверь, я много кнопок знаю на экране и на клаве



Исправлено 2 раз(а). Последнее : of63, 19.04.24 22:15
Ratings: 0 negative/0 positive
Re: Нужна функция получения даты в формате UTC/GMT, как на javascript. Т.е. вида Wed, 21 Oct 2015 07:28:00 GMT
ssa

Сообщений: 13015
Откуда: Москва
Дата регистрации: 23.03.2005
Не ту ты функцию, Паша, нашел.
Надо вот ту, что ниже. Тоже, кстати, авторство Пивы, я только слегка отрефакторил
*:********************************************************************
*:
*: Function : DATE_FORMAT
*:
*:********************************************************************
*!* Программа: DATEFORMAT
*!* Автор: Пирожков Вадим
*!* Дата: не известно
*!* Описание: Дата прописью по установленным в ОС настройкам даты и времени.
*!* Без обработки ошибок. Только для внутреннего использования.
*!* Параметры:
*!* m.date - Дата, которую надо перевести в "пропись"
*!* m.cFormat - Формат вывода
*!* Вызывается из:
*!* Вызывает:
*!* Модификации:
Lparameters ldDate, lcFormat, LocaleID
Local lcStruct, lcbuf, lnRL
Declare Integer GetDateFormat in Win32Api ;
Integer LCID ,;
Integer dwFlags,;
String SystemDate ,;
String lpFormat,;
String @ lpDateStr,;
Integer lenDate
lcStruct = ;
BINTOC(Year(ldDate), '2rs') ;
+BinToC(Month(ldDate), '2rs') ;
+BinToC(1, '2rs') ;
+BinToC(Day(ldDate), '2rs') ;
+Replicate(Chr(0),10)
#Define BUFLEN 50
lcbuf = Repl(Chr(0), BUFLEN)
lnRL = GetDateFormat(LOCALEID, 0, lcStruct, lcFormat, @lcbuf, BUFLEN)
#UNDEFINE BUFLEN
Return Iif(lnRL > 1, Left(lcbuf, lnRL-1), "")
А для получения нужного топикстартеру формата можно воспользоваться таким вызовом:
?date_format(Datetime(), 'ddd, dd MMM yyyy', 1033)+' '+ Ttoc(Datetime(),2)+' GMT'


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/1 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 16 (Гостей: 16)

© 2000-2024 Fox Club 
Яндекс.Метрика