public override Object ConvertScalar(PipelineContext ctx, Object value) { DateTime ret; String sValue = null; double dblDate = 0.0; if (value == null) { return(null); } JValue jv = value as JValue; if (jv != null) { switch (jv.Type) { default: goto CANNOT_CONVERT; case JTokenType.Date: ret = (DateTime)jv; goto EXIT_RTN; case JTokenType.Integer: dblDate = (long)jv; goto FROM_DBL; case JTokenType.Float: dblDate = (double)jv; goto FROM_DBL; case JTokenType.String: sValue = (String)jv; goto FROM_STR; } } switch (Type.GetTypeCode(value.GetType())) { default: goto CANNOT_CONVERT; case TypeCode.DateTime: ret = (DateTime)value; goto EXIT_RTN; case TypeCode.String: sValue = (String)value; goto FROM_STR; case TypeCode.Double: dblDate = (double)value; goto FROM_DBL; case TypeCode.Int32: dblDate = (int)value; goto FROM_DBL; case TypeCode.Int64: dblDate = (long)value; goto FROM_DBL; } CANNOT_CONVERT: throwConvert("DateTime", value); FROM_STR: if (String.IsNullOrEmpty(sValue)) { return(null); } sValue = replaceTimeZone(sValue); if (formats != null) { if (DateTime.TryParseExact(sValue, formats, CultureInfo.InvariantCulture, DateTimeStyles.AllowWhiteSpaces, out ret)) { goto EXIT_RTN; } } ret = Invariant.ToDateTime(sValue); goto EXIT_RTN; FROM_DBL: //1000000 days is beyond 2100 when it is a COM date, but its in the 2nd day since epoch for linux. So lets decide on that limit. ret = (dblDate < 1000000.0) ? DateTime.FromOADate(dblDate) : dtEpoch.AddSeconds(dblDate); goto EXIT_RTN; EXIT_RTN: switch (mode & (DateMode.ToLocal | DateMode.ToUtc)) { case DateMode.ToLocal: ret = ret.ToLocalTime(); break; case DateMode.ToUtc: ret = ret.ToUniversalTime(); break; } if ((mode & DateMode.ToUnspec) != 0) { ret = new DateTime(ret.Ticks, DateTimeKind.Unspecified); } return(ret); }