/// <summary> /// Evaluate the function using the arguments passed. /// </summary> /// <param name="args"> /// Result from the expressions evaluation. </param> /// <param name="sc"> /// Result of static context operation. </param> /// <exception cref="DynamicError"> /// Dynamic error. </exception> /// <returns> Result of the fn:dateTime operation. </returns> public static ResultSequence dateTime(ICollection args, StaticContext sc) { ICollection cargs = Function.convert_arguments(args, expected_args()); // get args IEnumerator argiter = cargs.GetEnumerator(); argiter.MoveNext(); ResultSequence arg1 = (ResultSequence)argiter.Current; argiter.MoveNext(); ResultSequence arg2 = (ResultSequence)argiter.Current; // if either of the parameter is an empty sequence, the result // is an empty sequence if (arg1 == null || arg2 == null || arg1.empty() || arg2.empty()) { return(ResultBuffer.EMPTY); } XSDate param1 = (XSDate)arg1.first(); XSTime param2 = (XSTime)arg2.first(); Calendar cal = Calendar.getInstance(); cal.set(param1.year(), param1.month() - 1, param1.day()); cal.set(Calendar.HOUR_OF_DAY, param2.hour()); cal.set(Calendar.MINUTE, param2.minute()); cal.set(Calendar.SECOND, (int)Math.Floor(param2.second())); cal.set(Calendar.MILLISECOND, 0); XSDuration dateTimeZone = param1.tz(); XSDuration timeTimeZone = param2.tz(); if ((dateTimeZone != null && timeTimeZone != null) && !dateTimeZone.StringValue.Equals(timeTimeZone.StringValue)) { // it's an error, if the arguments have different timezones throw DynamicError.inconsistentTimeZone(); } else if (dateTimeZone == null && timeTimeZone != null) { return(new XSDateTime(cal, timeTimeZone)); } else if (dateTimeZone != null && timeTimeZone == null) { return(new XSDateTime(cal, dateTimeZone)); } else if ((dateTimeZone != null && timeTimeZone != null) && dateTimeZone.StringValue.Equals(timeTimeZone.StringValue)) { return(new XSDateTime(cal, dateTimeZone)); } else { return(new XSDateTime(cal, null)); } }