View Raw SPL
/*****************************************************************************
*                                                                            *
*   GETDT.SPL     Copyright (C) 2006-2024 DSP Development Corporation        *
*                               All Rights Reserved                          *
*                                                                            *
*   Author:      Randy Race                                                  *
*                                                                            *
*   Synopsis:    Returns the date and time values of a series                *
*                                                                            *
*   Revisions:   13 Apr 2006  RRR  Creation                                  *
*                26 Oct 2007  RRR  tod fix for date values                   *
*                30 Aug 2024  RRR  UTC time and series items                 *
*                                                                            *
*****************************************************************************/

#if @HELP_GETDT

    GETDT

    Purpose: Returns the date and time values of a series.

    Syntax:  GETDT(series, utc, item)
             (date, time, y) = GETDT(series, utc, item)

             series - An interval or XY series.

                utc - Optional. An integer, the UTC date/time flag.

                       0: use local date/time (default)
                       1: use UTC date/time

               item - Optional. An integer, the series item.
                      Defauls to -1, the current focus.

    Returns: A 2 column table with the date and time values in
             each column.

             (date, time) = GETDT(series) returns the date and time
             values as separate series.

    Example:
             W1: {julstr("1-1-99"), julstr("1-10-99"), julstr("4-2-99")}
             W2: {todstr("12:00"), todstr("14:00"), todstr("9:35")}
             W3: {1, 2, .5};setvunits("V")
             W4: xydt(w1, w2, w3)
             W5: getdt(w4)

             The table in W5 consists of the values:

             1-01-1999,  12:00:00.000
             1-10-1999,  14:00:00.000
             4-02-1999,  09:35:00.000

    Example:
             W1: {julstr("1-1-99"), julstr("1-10-99"), julstr("4-2-99")}
             W2: {todstr("12:00"), todstr("14:00"), todstr("9:35")}
             W3: {1, 2, .5};setvunits("V")
             W4: xydt(w1, w2, w3)
             W5: getdt(w4, 1)

             Same as above except given the input local date/time values,
             the returned date/time values are in UTC time.

    Remarks:
             GETDT breaks out the date and time values from any series.

             The series date and time values are always saved in local
             date/time. If UTC is 1, the returned date/time values are
             in UTC date/time.

             The plot style is set to table view.

             See DTXY to return the date, time and Y values from a series.

             See XYDT to produce an XY series from separate date, time and
             y value series.

    See Also:
             Dtxy
             Julstr
             Todstr
             Julymd
             Xy
             Xydt
#endif

static dt_time = "";
static dt_date = "";

/* get the Date and Time values from a series */
ITERATE getdt2(s, utc = 0, item = -1, dt_mode = 4)
{
        local dt, dval, tval, time, date, delta_t;

        if (argc < 1 || not(isarray(s))) error(sprintf("%s - input series required"));

        if (length(s) == 0)
        {
                return({});
        }

        if (iswindow(s))
        {
                item = (item < 0) ? getfocus(s) : item;
        }
        else
        {
                item = 1;
        }

        /* normalize dt format */
        dt_time = setconfig("dt_time_format", 0);
        dt_date = setconfig("dt_date_format", 0);

        /* time values with msec */
        dt = xvals(s, item, dt_mode);
        
        setmatrix(dt, 0);

        if (utc)
        {
                /* utc time offset */
                delta_t = todmsecstr(getutctime(s, -1, item)) - todmsecstr(gettime(s, -1, item));

                dt += delta_t;
        }

        /* day overflow */
        days = int(dt / 86400);

        /* starting date */
        date = (utc) ? getutcdate(s, -1, item) : getdate(s, -1, item);
        dval = days + julstr(date);

        setmatrix(dval, 0);
        setvunits(dval, "Date");

        /* time values */
        tval = dt - days * 86400;
        setvunits(tval, "Real Time");

        setconfig("dt_time_format", dt_time);
        dt_time = "";

        setconfig("dt_date_format", dt_date);
        dt_date = "";

        if (outargc > 1)
        {
                return(dval, tval);
        }
        else
        {
                dt = ravel(dval, tval);
                setplotstyle(dt, 4);
                return(dt);
        }
}


/* error handler */
getdt_error(errnum, errmes)
{
        if (not(isstring(dt_time)))
        {
                setconfig("dt_time_format", dt_time);
                dt_time = "";
        }

        if (not(isstring(dt_date)))
        {
                setconfig("dt_date_format", dt_date);
                dt_date = "";
        }

        error(errmes);
}