View Raw SPL
/* parse args for UTC functions, return date/time series and timezone */
utc_parse_args(date, time, timezone, def_local = TRUE, convert_localstr = TRUE)
{
        local isstring = FALSE, d, t;

        if (not(isstring(timezone)))
        {
                error(sprintf("%s - unrecognized timezone", __CALLER__));
        }

        if (isarray(date))
        {
                if (isdatestr(time))
                {
                        /* assume startdate */
                        startdate = time;
                }
                else if (isstring(time) && not(istimestr(time)))
                {
                        /* assume timezone */
                        timezone = time;
                }

                if (numcols(date) > 1 && (isempty(time) || not(isarray(time))))
                {
                        time = date[.., 2..2..end];
                        date = date[.., 1..2..end];
                }
        }
        
        if (isstring(date) && (isempty(time) || isstring(time)))
        {
                /* parse strings */
                isstring = TRUE;

                d = def_local ? getdate()   : getutcdate();
                t = def_local ? gettime(13) : getutctime(13);

                /* date parse */
                if (isdatestr(date))
                {
                        d = date;
                        date = "";
                }
                else if (isdatestr(time))
                {
                        d = time;
                        time = "";
                }
                else if (isdatestr(timezone))
                {
                        d = timezone;
                        timezone = "";
                }
                
                /* time parse */
                if (istimestr(date))
                {
                        t = date;
                        date = "";
                }
                else if (istimestr(time))
                {
                        t = time;
                        time = "";
                }
                else if (istimestr(timezone))
                {
                        t = timezone;
                        timezone = "";
                }
                
                if (strlen(date) > 0)
                {
                        if (strlen(timezone) == 0)
                        {
                                timezone = date;
                                d = def_local ? getdate() : getutcdate();
                        }
                        else
                        {
                                error(sprintf("%s - unrecognized date '%s'", __CALLER__, date));
                        }
                }

                /* convert to series */
                date = {julstr(d)};

                if (isarray(time) && isempty(time))
                {
                        t = {};
                }
                else if (strlen(time) > 0)
                {
                        if (strlen(timezone) == 0)
                        {
                                timezone = time;
                                t = def_local ? gettime(13) : getutctime(13);
                        }
                        else
                        {
                                error(sprintf("%s - unrecognized time '%s'", __CALLER__, time));
                        }
                }

                if (not(isempty(t)))
                {
                        /* convert to series */
                        time = {todmsecstr(t)};
                }
        }
        else if (isstring(date))
        {
                if (isdatestr(date))
                {
                        date = {julstr(date)};
                        date = rep(date, length(time));
                }
                else if (istimestr(date))
                {
                        d = time;
                        time = {todmsecstr(date)};
                        time = rep(time, length(d));
                        date = d;
                }
                else if (strlen(timezone) == 0)
                {
                        d = def_local ? getdate() : getutcdate();
                        timezone = date;
                        date  = {julstr(d)};
                        date  = rep(date, length(time));
                }
                else
                {
                        error(sprintf("%s - unrecognized date '%s'", __CALLER__, date));
                }
        }
        else if (isstring(time))
        {
                if (isdatestr(time))
                {
                        d = {julstr(time)};
                        time = date;
                        date = rep(d, length(time));
                }
                else if (istimestr(time))
                {
                        time = {todmsecstr(time)};
                        time = rep(time, length(time));
                }
                else if (strlen(timezone) == 0)
                {
                        t = def_local ? gettime(13) : getutctime(13);
                        timezone = time;
                        time  = {todmsecstr(t)};
                        time  = rep(time, length(date));
                }
                else
                {
                        error(sprintf("%s - unrecognized time '%s'", __CALLER__, time));
                }
        }

        if (isscalar(date))
        {
                if (isscalar(time))
                {
                        time = {time};
                }
                
                date = {date};
        }
        else if (isscalar(time))
        {
                time = {time};
        }

        /* time zone additions */
        if (convert_localstr)
        {
                if (tolower(timezone) == "local")
                {
                        timezone = "";
                }
        }

        if (tolower(timezone) == "z")
        {
                timezone = "Etc/UTC";
        }

        return(date, time, timezone, isstring);
}