Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2013, 23:41   #1
nikcpp
Пользователь
 
Регистрация: 05.04.2011
Сообщений: 35
Хорошо Формат времени

Подскажите как с формата YYYY-MM-DDTHH:MM:SS.ZZZZ+HH перевести в формат YYYY-MM-DD HH:MM:SS .
nikcpp вне форума Ответить с цитированием
Старый 26.11.2013, 23:50   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Откуда время получаешь?
И в каком виде? В виде строки?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.11.2013, 00:08   #3
nikcpp
Пользователь
 
Регистрация: 05.04.2011
Сообщений: 35
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Откуда время получаешь?
И в каком виде? В виде строки?
да в виде строки. получаю с eventlog windows 7 использую при этом WMI
nikcpp вне форума Ответить с цитированием
Старый 27.11.2013, 00:46   #4
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

http://www.delphibasics.ru/DateTimeToString.php DateTimeToString
http://www.delphibasics.ru/FormatDateTime.php FormatDateTime
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 27.11.2013, 04:24   #5
nikcpp
Пользователь
 
Регистрация: 05.04.2011
Сообщений: 35
По умолчанию

Цитата:
Сообщение от alextrof94 Посмотреть сообщение
Это не то, ни DateTimeToString ни FormatDateTime не знают что такое +HH , а это часовой пояс. который надо учитывать.
nikcpp вне форума Ответить с цитированием
Старый 27.11.2013, 05:26   #6
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Парсь строку на составляющие и делай что хочешь.
Вроде должно работать. Если не работает, то ошибка скорее всего в прибавлении и убавлении дат, попробуй использовать модуль DateUtils и его функции IncHour, IncMinute и подобные.
Код:
function GetDateTimeString(StrIn: String): String; //в функцию подаем строку вида "YYYY-MM-DDTHH:MM:SS.ZZZZ+HH"
var 
 Date: TDateTime;
begin
 Date:=StrToDateTime(Copy(StrIn, 1, 10)); //берем дату
 Date:=Date+StrToTime(Copy(StrIn, 12, 8)); //берем и прибавляем время
 if Copy(StrIn, 25, 1)='+' then
  Date:=Date+StrToTime(Copy(StrIn, 26, 2)) //если стоит знак+ то прибавляем часовой пояс
 else
  Date:=Date-StrToTime(Copy(StrIn, 26, 2)); //иначе убавляем часовой пояс

 Result:=FormatDateTime('YYYY-MM-DD HH:MM:SS', Date);
end;
Ну или без объявления доп переменных. Хрен знает, заработает ли, даже если пример выше сработает.
Код:
function GetDateTimeString(StrIn: String): String; //в функцию подаем строку вида "YYYY-MM-DDTHH:MM:SS.ZZZZ+HH"
begin
 if Copy(StrIn, 25, 1)='+' then
  Result:=FormatDateTime('YYYY-MM-DD HH:MM:SS', 
   StrToDateTime(Copy(StrIn, 1, 10))+
   StrToTime(Copy(StrIn, 12, 8))+
   StrToTime(Copy(StrIn, 26, 2)))
 else
  Result:=FormatDateTime('YYYY-MM-DD HH:MM:SS', 
   StrToDateTime(Copy(StrIn, 1, 10))+
   StrToTime(Copy(StrIn, 12, 8))-
   StrToTime(Copy(StrIn, 26, 2)));
end;
alextrof94$gmail.com

Последний раз редактировалось alextrof94; 27.11.2013 в 05:31.
alextrof94 вне форума Ответить с цитированием
Старый 27.11.2013, 08:09   #7
nikcpp
Пользователь
 
Регистрация: 05.04.2011
Сообщений: 35
Хорошо

Цитата:
Сообщение от alextrof94 Посмотреть сообщение
Парсь строку на составляющие и делай что хочешь.
Вроде должно работать. Если не работает, то ошибка скорее всего в прибавлении и убавлении дат, попробуй использовать модуль DateUtils и его функции IncHour, IncMinute и подобные.
Код:
function GetDateTimeString(StrIn: String): String; //в функцию подаем строку вида "YYYY-MM-DDTHH:MM:SS.ZZZZ+HH"
var 
 Date: TDateTime;
begin
 Date:=StrToDateTime(Copy(StrIn, 1, 10)); //берем дату
 Date:=Date+StrToTime(Copy(StrIn, 12, 8)); //берем и прибавляем время
 if Copy(StrIn, 25, 1)='+' then
  Date:=Date+StrToTime(Copy(StrIn, 26, 2)) //если стоит знак+ то прибавляем часовой пояс
 else
  Date:=Date-StrToTime(Copy(StrIn, 26, 2)); //иначе убавляем часовой пояс

 Result:=FormatDateTime('YYYY-MM-DD HH:MM:SS', Date);
end;
Ну или без объявления доп переменных. Хрен знает, заработает ли, даже если пример выше сработает.
Код:
function GetDateTimeString(StrIn: String): String; //в функцию подаем строку вида "YYYY-MM-DDTHH:MM:SS.ZZZZ+HH"
begin
 if Copy(StrIn, 25, 1)='+' then
  Result:=FormatDateTime('YYYY-MM-DD HH:MM:SS', 
   StrToDateTime(Copy(StrIn, 1, 10))+
   StrToTime(Copy(StrIn, 12, 8))+
   StrToTime(Copy(StrIn, 26, 2)))
 else
  Result:=FormatDateTime('YYYY-MM-DD HH:MM:SS', 
   StrToDateTime(Copy(StrIn, 1, 10))+
   StrToTime(Copy(StrIn, 12, 8))-
   StrToTime(Copy(StrIn, 26, 2)));
end;
Я тоже поначалу так думал но там есть свои подводные камни , иногда надо будет и деть прибавлять и месяц и год,
могу привести пример с днем
2013-11-25T23:57:49.1234+04 должно получиться 2013-11-26 03:57:49

Вот я сижу и думаю что делать есть 2 варианта.
1. Написать свою функцию и парсить строку со всеми проверками (на месяц год день и высокоомные года)
2. написать библиотеку на XE4 с использованием stringhealp
nikcpp вне форума Ответить с цитированием
Старый 27.11.2013, 08:46   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
иногда надо будет и деть прибавлять и месяц и год
Зачем? Прибавляя(отнимая) к дате-времени несколько часов(минут, секунд) в ней и без вашего участия при необходимости изменится число (месяц, год)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.11.2013, 08:58   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Написать свою функцию и парсить строку со всеми проверками (на месяц год день и высокоомные года)
Да Вам нужно всего навсего
1) перевести всю часть до TMZ в формат DateTime
2) распарсить строки, выдернув смещение (я бы взял от конца строки первый знак + или - )
3) стандартными функция прибавил смещение (в часах) к дате, полученной в п 1).
профит.


Аватар, извините, я по сути продублировал ваш ответ.
Когда писал, забыл обновить страницу и не увидел ваш пост...

Последний раз редактировалось Serge_Bliznykov; 27.11.2013 в 09:01.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.11.2013, 09:53   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
var s,c: String;
    d: TDateTime;

  s:='2013-11-27T07:36:24.2222+04';
  try
    d:=EncodeDateTime(StrToInt(Copy(s,1,4)),
                      StrToInt(Copy(s,6,2)),
                      StrToInt(Copy(s,9,2)),
                      StrToInt(Copy(s,12,2)),
                      StrToInt(Copy(s,15,2)),
                      StrToInt(Copy(s,18,2)),
                      0);
    d:=IncHour(d,StrToInt(Copy(s,25,3)));
    c:=FormatDateTime('yyyy-mm-dd hh:nn:ss',d); //результат
  except
  //что-то вроде сообщения о не допустимых входных данных
  end;
Только совсем не уверен, что нужно смещение из данных использовать. Возможено оно и не нужно, а нужно смещение своего часового пояса. Ну это ТС разбираться
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как преобразовать формат времени в числовой формат solnce60 Microsoft Office Excel 1 28.04.2013 11:16
формат времени aleklepp Microsoft Office Excel 4 01.11.2011 16:20
Формат времени Nebojitel Microsoft Office Excel 7 27.05.2011 22:19
Формат времени ruavia3 Microsoft Office Excel 3 15.03.2010 11:30
Формат времени artemavd Общие вопросы Delphi 6 22.09.2009 15:23