Sequence FunctionAdjustTimeToTimezone::createSequence(DynamicContext* context, int flags) const { XPath2MemoryManager* memMgr = context->getMemoryManager(); //If $srcval is the empty sequence, then the result is the empty sequence. Sequence op1 = getParamNumber(1, context)->toSequence(context); if (op1.isEmpty()) { return Sequence(memMgr); } const ATTimeOrDerived* time = (const ATTimeOrDerived*)(const Item*)op1.first(); //If $timezone is not specified, then $timezone is the value of the implicit timezone in the evaluation context. ATDurationOrDerived::Ptr timezoneAsDuration = 0; if (getNumArgs() > 1) { Sequence op2 = getParamNumber(2, context)->toSequence(context); if (op2.isEmpty()) { // unset the timezone return Sequence(time->setTimezone(0, context), memMgr); } else { timezoneAsDuration = (const ATDurationOrDerived::Ptr )op2.first(); Timezone::Ptr timezone = new Timezone(timezoneAsDuration, context); if(!timezoneAsDuration->equals(timezone->asDayTimeDuration(context), context)) { XQThrow(FunctionException, X("FunctionAdjustTimeToTimeZone::createSequence"),X("Invalid timezone value [err:FODT0003]")); } } } else { timezoneAsDuration = context->getImplicitTimezone(); } return Sequence(time->addTimezone(timezoneAsDuration, context), memMgr); }
/** Sets the timezone to the given timezone.*/ ATGYearOrDerived::Ptr ATGYearOrDerivedImpl::setTimezone(const Timezone::Ptr &timezone, const DynamicContext* context) const { XMLBuffer buffer(1023, context->getMemoryManager()); DateUtils::formatNumber(_YY, 4, buffer); if(timezone != NULLRCP) buffer.append(timezone->asString(context)); return context->getItemFactory()->createGYearOrDerived(this->getTypeURI(), this->getTypeName(), buffer.getRawBuffer(), context); }
Sequence FunctionTimezoneFromDate::createSequence(DynamicContext* context, int flags) const { XPath2MemoryManager* memMgr = context->getMemoryManager(); Sequence arg=getParamNumber(1,context)->toSequence(context); if(arg.isEmpty()) return Sequence(memMgr); const ATDateOrDerived *date = (const ATDateOrDerived*)(const Item*)arg.first(); // If $srcval does not contain a timezone, the result is the empty sequence if (date->hasTimezone() == false) { return Sequence(memMgr); } const Timezone::Ptr timezone = date->getTimezone(); return Sequence( (const Item::Ptr )timezone->asDayTimeDuration(context), memMgr ); }
static inline MAPM referenceDateTime(const MAPM &MM, bool hasTimezone, const Timezone::Ptr &timezone) { MAPM result = DateUtils::convertDMY2Absolute(DateUtils::maximumDayInMonthFor(1972, MM), MM, 1972) * DateUtils::g_secondsPerDay; if(hasTimezone) { result -= timezone->asSeconds(); } return result; }
static inline MAPM referenceDateTime(const MAPM &YY, bool hasTimezone, const Timezone::Ptr &timezone) { MAPM result = DateUtils::convertDMY2Absolute(1, 1, YY) * DateUtils::g_secondsPerDay; if(hasTimezone) { result -= timezone->asSeconds(); } return result; }