Exemplo n.º 1
0
        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);
        }