Как лучше всего преобразовать строку UTC в дату в Crystal Reports?

Учитывая строку времени UTC, подобную этой:

2005-11-01T00:00:00-04:00

Как лучше всего преобразовать его в DateTime с помощью формулы Crystal Reports?

Мое лучшее решение опубликовано ниже.

Я надеюсь, что кто-то там может поразить меня одной строчкой...


person JosephStyons    schedule 07.11.2008    source источник
comment
Придерживайтесь своего решения. Один лайнер просто делает код менее читаемым. Теоретически вы можете выиграть пару тактов, но полученная сумма слишком мала, чтобы с ней заморачиваться.   -  person Jim C    schedule 15.05.2009


Ответы (3)


Ну вот:

CDateTime(CDate(Split({?UTCDateString}, "T")[1]) , CTime(Split(Split({?UTCDateString}, "T")[2], "-")[1]))
person jons911    schedule 07.11.2008

Могу ли я предложить упрощение ответа jons911:

CDateTime(CDate(Left({@UTCString}, 10)), CTime(Mid({@UTCString}, 12, 8)));  

Это имеет то преимущество, что формула работает для часовых поясов, предшествующих UTC 0 (например, +01:00). Конечно, он полагается на то, что строка UTC является правильно отформатированной строкой ISO 8601.

person Anthony K    schedule 13.11.2008

Вот мое лучшее решение с комментариями:

//assume a date stored as a string in this format:
//2005-11-01T00:00:00-04:00
//return a DateTime value
StringVar fieldValue;
StringVar datePortion;
StringVar timePortion;
NumberVar yearPortion;
NumberVar monthPortion;
NumberVar dayPortion;
NumberVar hourPortion;
NumberVar minutePortion;
NumberVar secondPortion;

//store the field locally so i can easily copy-paste into another formula
//(where the field name will be different)
//Crystal formulas do not use a powerful language.
fieldValue := {PACT.ReferralDate};

//break up the date & time parts.
//ignore the -04:00 offset part of the time.
datePortion := Split (fieldValue,"T")[1];
timePortion := Split(Split (fieldValue,"T")[2],"-")[1];

yearPortion := ToNumber(Split(datePortion,"-")[1]);
monthPortion := ToNumber(Split(datePortion,"-")[2]);
dayPortion := ToNumber(Split(datePortion,"-")[3]);

hourPortion := ToNumber(Split(timePortion,":")[1]);
minutePortion := ToNumber(Split(timePortion,":")[2]);
secondPortion := ToNumber(Split(timePortion,":")[3]);

//finally, return the result as a date-time
DateTime(yearPortion,monthPortion,dayPortion,hourPortion,minutePortion,secondPortion);
person JosephStyons    schedule 07.11.2008