nashorn/src/jdk/nashorn/internal/objects/NativeDate.java
author jlaskey
Fri, 04 Jan 2013 09:58:33 -0400
changeset 16151 97c1e756ae1e
parent 16147 e63b63819133
child 16188 d6390b0ea32a
permissions -rw-r--r--
8005663: Update copyright year to 2013 Reviewed-by: sundar Contributed-by: james.laskey@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     1
/*
16151
97c1e756ae1e 8005663: Update copyright year to 2013
jlaskey
parents: 16147
diff changeset
     2
 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     4
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    10
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    15
 * accompanied this code).
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    16
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    20
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    23
 * questions.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    24
 */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    25
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    26
package jdk.nashorn.internal.objects;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    27
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    28
import static java.lang.Double.NaN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    29
import static java.lang.Double.isInfinite;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    30
import static java.lang.Double.isNaN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    31
import static jdk.nashorn.internal.runtime.ECMAErrors.rangeError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    32
import static jdk.nashorn.internal.runtime.ECMAErrors.typeError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    33
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    34
import java.util.Locale;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    35
import java.util.TimeZone;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    36
import jdk.nashorn.internal.objects.annotations.Attribute;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    37
import jdk.nashorn.internal.objects.annotations.Constructor;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    38
import jdk.nashorn.internal.objects.annotations.Function;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    39
import jdk.nashorn.internal.objects.annotations.ScriptClass;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    40
import jdk.nashorn.internal.objects.annotations.SpecializedConstructor;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    41
import jdk.nashorn.internal.objects.annotations.Where;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    42
import jdk.nashorn.internal.runtime.ConsString;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    43
import jdk.nashorn.internal.runtime.Context;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    44
import jdk.nashorn.internal.runtime.JSType;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    45
import jdk.nashorn.internal.runtime.ScriptFunction;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    46
import jdk.nashorn.internal.runtime.ScriptObject;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    47
import jdk.nashorn.internal.runtime.ScriptRuntime;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    48
import jdk.nashorn.internal.runtime.linker.InvokeByName;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    49
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    50
/**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    51
 * ECMA 15.9 Date Objects
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    52
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    53
 */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    54
@ScriptClass("Date")
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    55
public final class NativeDate extends ScriptObject {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    56
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    57
    private static final String INVALID_DATE = "Invalid Date";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    58
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    59
    private static final int YEAR        = 0;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    60
    private static final int MONTH       = 1;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    61
    private static final int DAY         = 2;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    62
    private static final int HOUR        = 3;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    63
    private static final int MINUTE      = 4;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    64
    private static final int SECOND      = 5;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    65
    private static final int MILLISECOND = 6;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    66
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    67
    private static final int FORMAT_DATE_TIME       = 0;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    68
    private static final int FORMAT_DATE            = 1;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    69
    private static final int FORMAT_TIME            = 2;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    70
    private static final int FORMAT_LOCAL_DATE_TIME = 3;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    71
    private static final int FORMAT_LOCAL_DATE      = 4;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    72
    private static final int FORMAT_LOCAL_TIME      = 5;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    73
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    74
    // Constants defined in ECMA 15.9.1.10
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    75
    private static final double hoursPerDay      = 24;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    76
    private static final double minutesPerHour   = 60;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    77
    private static final double secondsPerMinute = 60;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    78
    private static final double msPerSecond   = 1_000;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    79
    private static final double msPerMinute  = 60_000;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    80
    private static final double msPerHour = 3_600_000;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    81
    private static final double msPerDay = 86_400_000;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    82
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    83
    private static int[][] firstDayInMonth = {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    84
            {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}, // normal year
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    85
            {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335}  // leap year
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    86
    };
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    87
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    88
    private static String[] weekDays = {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    89
            "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    90
    };
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    91
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    92
    private static String[] months = {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    93
            "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    94
    };
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    95
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    96
    private static final InvokeByName TO_ISO_STRING = new InvokeByName("toISOString", ScriptObject.class, Object.class,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    97
            Object.class);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    98
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    99
    private double time;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   100
    private final TimeZone timezone;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   101
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   102
    NativeDate() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   103
        this(System.currentTimeMillis());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   104
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   105
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   106
    NativeDate(final double time) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   107
        final Context context = Global.getThisContext();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   108
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   109
        this.time = time;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   110
        this.timezone = context.getTimeZone();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   111
        this.setProto(Global.instance().getDatePrototype());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   112
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   113
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   114
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   115
    public String getClassName() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   116
        return "Date";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   117
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   118
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   119
    // ECMA 8.12.8 [[DefaultValue]] (hint)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   120
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   121
    public Object getDefaultValue(final Class<?> hint) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   122
        // When the [[DefaultValue]] internal method of O is called with no hint,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   123
        // then it behaves as if the hint were Number, unless O is a Date object
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   124
        // in which case it behaves as if the hint were String.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   125
        return super.getDefaultValue(hint == null ? String.class : hint);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   126
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   127
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   128
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   129
     * Constructor - ECMA 15.9.3.1 new Date
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   130
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   131
     * @param isNew is this Date constructed with the new operator
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   132
     * @param self  self references
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   133
     * @return Date representing now
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   134
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   135
    @SpecializedConstructor
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   136
    public static Object construct(final boolean isNew, final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   137
        final NativeDate result = new NativeDate();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   138
        return isNew ? result : toStringImpl(result, FORMAT_DATE_TIME);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   139
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   140
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   141
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   142
     * Constructor - ECMA 15.9.3.1 new Date (year, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   143
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   144
     * @param isNew is this Date constructed with the new operator
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   145
     * @param self  self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   146
     * @param args  arguments
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   147
     * @return new Date
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   148
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   149
    @Constructor(arity = 7)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   150
    public static Object construct(final boolean isNew, final Object self, final Object... args) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   151
        NativeDate result;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   152
        switch (args.length) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   153
        case 0:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   154
            result = new NativeDate();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   155
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   156
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   157
        case 1:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   158
            double num;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   159
            final Object arg = JSType.toPrimitive(args[0]);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   160
            if (arg instanceof String || arg instanceof ConsString) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   161
                num = parseDateString(arg.toString());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   162
            } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   163
                num = timeClip(JSType.toNumber(args[0]));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   164
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   165
            result = new NativeDate(num);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   166
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   167
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   168
        default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   169
            result = new NativeDate(0);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   170
            final double[] d = convertCtorArgs(args);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   171
            if (d == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   172
                result.setTime(Double.NaN);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   173
            } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   174
                final double time = timeClip(utc(makeDate(d), result.getTimeZone()));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   175
                result.setTime(time);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   176
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   177
            break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   178
         }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   179
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   180
         return isNew ? result : toStringImpl(new NativeDate(), FORMAT_DATE_TIME);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   181
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   182
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   183
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   184
    public String safeToString() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   185
        return "[Date " + toISOStringImpl(this) + "]";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   186
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   187
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   188
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   189
    public String toString() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   190
        return isValidDate() ? toString(this).toString() : INVALID_DATE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   191
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   192
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   193
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   194
     * ECMA 15.9.4.2 Date.parse (string)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   195
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   196
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   197
     * @param string string to parse as date
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   198
     * @return Date interpreted from the string, or NaN for illegal values
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   199
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   200
    @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   201
    public static Object parse(final Object self, final Object string) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   202
        return parseDateString(JSType.toString(string));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   203
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   204
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   205
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   206
     * ECMA 15.9.4.3 Date.UTC (year, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   207
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   208
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   209
     * @param args mandatory args are year, month. Optional are date, hours, minutes, seconds and milliseconds
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   210
     * @return a time clip according to the ECMA specification
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   211
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   212
    @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 7, where = Where.CONSTRUCTOR)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   213
    public static Object UTC(final Object self, final Object... args) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   214
        final NativeDate nd = new NativeDate(0);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   215
        final double[] d = convertCtorArgs(args);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   216
        final double time = d == null ? Double.NaN : timeClip(makeDate(d));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   217
        nd.setTime(time);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   218
        return time;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   219
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   220
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   221
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   222
     * ECMA 15.9.4.4 Date.now ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   223
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   224
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   225
     * @return a Date that points to the current moment in time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   226
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   227
    @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   228
    public static Object now(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   229
        return (double)System.currentTimeMillis();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   230
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   231
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   232
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   233
     * ECMA 15.9.5.2 Date.prototype.toString ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   234
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   235
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   236
     * @return string value that represents the Date in the current time zone
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   237
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   238
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   239
    public static Object toString(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   240
        return toStringImpl(self, FORMAT_DATE_TIME);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   241
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   242
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   243
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   244
     * ECMA 15.9.5.3 Date.prototype.toDateString ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   245
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   246
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   247
     * @return string value with the "date" part of the Date in the current time zone
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   248
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   249
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   250
    public static Object toDateString(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   251
        return toStringImpl(self, FORMAT_DATE);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   252
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   253
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   254
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   255
     * ECMA 15.9.5.4 Date.prototype.toTimeString ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   256
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   257
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   258
     * @return string value with "time" part of Date in the current time zone
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   259
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   260
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   261
    public static Object toTimeString(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   262
        return toStringImpl(self, FORMAT_TIME);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   263
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   264
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   265
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   266
     * ECMA 15.9.5.5 Date.prototype.toLocaleString ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   267
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   268
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   269
     * @return string value that represents the Data in the current time zone and locale
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   270
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   271
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   272
    public static Object toLocaleString(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   273
        return toStringImpl(self, FORMAT_LOCAL_DATE_TIME);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   274
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   275
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   276
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   277
     * ECMA 15.9.5.6 Date.prototype.toLocaleDateString ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   278
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   279
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   280
     * @return string value with the "date" part of the Date in the current time zone and locale
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   281
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   282
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   283
    public static Object toLocaleDateString(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   284
        return toStringImpl(self, FORMAT_LOCAL_DATE);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   285
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   286
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   287
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   288
     * ECMA 15.9.5.7 Date.prototype.toLocaleTimeString ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   289
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   290
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   291
     * @return string value with the "time" part of Date in the current time zone and locale
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   292
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   293
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   294
    public static Object toLocaleTimeString(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   295
        return toStringImpl(self, FORMAT_LOCAL_TIME);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   296
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   297
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   298
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   299
     * ECMA 15.9.5.8 Date.prototype.valueOf ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   300
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   301
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   302
     * @return valueOf - a number which is this time value
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   303
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   304
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   305
    public static Object valueOf(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   306
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   307
        return (nd != null) ? nd.getTime() : Double.NaN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   308
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   309
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   310
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   311
     * ECMA 15.9.5.9 Date.prototype.getTime ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   312
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   313
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   314
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   315
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   316
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   317
    public static Object getTime(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   318
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   319
        return (nd != null) ? nd.getTime() : Double.NaN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   320
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   321
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   322
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   323
     * ECMA 15.9.5.10 Date.prototype.getFullYear ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   324
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   325
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   326
     * @return full year
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   327
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   328
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   329
    public static Object getFullYear(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   330
        return getField(self, YEAR);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   331
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   332
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   333
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   334
     * ECMA 15.9.5.11 Date.prototype.getUTCFullYear( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   335
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   336
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   337
     * @return UTC full year
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   338
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   339
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   340
    public static Object getUTCFullYear(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   341
        return getUTCField(self, YEAR);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   342
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   343
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   344
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   345
     * B.2.4 Date.prototype.getYear ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   346
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   347
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   348
     * @return year
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   349
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   350
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   351
    public static Object getYear(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   352
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   353
        return (nd != null && nd.isValidDate()) ? (yearFromTime(nd.getLocalTime()) - 1900) : Double.NaN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   354
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   355
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   356
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   357
     * ECMA 15.9.5.12 Date.prototype.getMonth ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   358
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   359
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   360
     * @return month
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   361
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   362
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   363
    public static Object getMonth(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   364
        return getField(self, MONTH);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   365
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   366
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   367
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   368
     * ECMA 15.9.5.13 Date.prototype.getUTCMonth ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   369
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   370
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   371
     * @return UTC month
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   372
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   373
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   374
    public static Object getUTCMonth(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   375
        return getUTCField(self, MONTH);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   376
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   377
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   378
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   379
     * ECMA 15.9.5.14 Date.prototype.getDate ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   380
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   381
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   382
     * @return date
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   383
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   384
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   385
    public static Object getDate(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   386
        return getField(self, DAY);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   387
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   388
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   389
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   390
     * ECMA 15.9.5.15 Date.prototype.getUTCDate ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   391
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   392
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   393
     * @return UTC Date
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   394
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   395
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   396
    public static Object getUTCDate(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   397
        return getUTCField(self, DAY);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   398
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   399
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   400
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   401
     * ECMA 15.9.5.16 Date.prototype.getDay ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   402
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   403
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   404
     * @return day
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   405
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   406
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   407
    public static Object getDay(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   408
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   409
        return (nd != null && nd.isValidDate()) ? weekDay(nd.getLocalTime()) : Double.NaN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   410
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   411
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   412
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   413
     * ECMA 15.9.5.17 Date.prototype.getUTCDay ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   414
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   415
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   416
     * @return UTC day
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   417
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   418
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   419
    public static Object getUTCDay(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   420
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   421
        return (nd != null && nd.isValidDate()) ? weekDay(nd.getTime()) : Double.NaN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   422
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   423
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   424
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   425
     * ECMA 15.9.5.18 Date.prototype.getHours ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   426
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   427
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   428
     * @return hours
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   429
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   430
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   431
    public static Object getHours(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   432
        return getField(self, HOUR);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   433
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   434
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   435
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   436
     * ECMA 15.9.5.19 Date.prototype.getUTCHours ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   437
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   438
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   439
     * @return UTC hours
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   440
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   441
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   442
    public static Object getUTCHours(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   443
        return getUTCField(self, HOUR);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   444
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   445
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   446
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   447
     * ECMA 15.9.5.20 Date.prototype.getMinutes ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   448
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   449
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   450
     * @return minutes
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   451
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   452
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   453
    public static Object getMinutes(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   454
        return getField(self, MINUTE);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   455
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   456
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   457
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   458
     * ECMA 15.9.5.21 Date.prototype.getUTCMinutes ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   459
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   460
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   461
     * @return UTC minutes
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   462
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   463
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   464
    public static Object getUTCMinutes(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   465
        return getUTCField(self, MINUTE);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   466
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   467
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   468
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   469
     * ECMA 15.9.5.22 Date.prototype.getSeconds ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   470
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   471
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   472
     * @return seconds
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   473
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   474
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   475
    public static Object getSeconds(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   476
        return getField(self, SECOND);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   477
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   478
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   479
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   480
     * ECMA 15.9.5.23 Date.prototype.getUTCSeconds ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   481
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   482
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   483
     * @return UTC seconds
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   484
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   485
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   486
    public static Object getUTCSeconds(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   487
        return getUTCField(self, SECOND);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   488
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   489
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   490
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   491
     * ECMA 15.9.5.24 Date.prototype.getMilliseconds ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   492
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   493
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   494
     * @return milliseconds
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   495
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   496
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   497
    public static Object getMilliseconds(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   498
        return getField(self, MILLISECOND);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   499
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   500
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   501
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   502
     * ECMA 15.9.5.25 Date.prototype.getUTCMilliseconds ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   503
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   504
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   505
     * @return UTC milliseconds
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   506
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   507
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   508
    public static Object getUTCMilliseconds(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   509
        return getUTCField(self, MILLISECOND);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   510
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   511
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   512
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   513
     * ECMA 15.9.5.26 Date.prototype.getTimezoneOffset ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   514
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   515
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   516
     * @return time zone offset or NaN if N/A
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   517
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   518
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   519
    public static Object getTimezoneOffset(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   520
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   521
        if (nd != null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   522
            final long msec = (long) nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   523
            return - nd.getTimeZone().getOffset(msec) / msPerMinute;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   524
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   525
        return Double.NaN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   526
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   527
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   528
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   529
     * ECMA 15.9.5.27 Date.prototype.setTime (time)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   530
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   531
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   532
     * @param time time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   533
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   534
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   535
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   536
    public static Object setTime(final Object self, final Object time) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   537
        final double     num = timeClip(JSType.toNumber(time));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   538
        final NativeDate nd  = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   539
        nd.setTime(num);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   540
        return num;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   541
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   542
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   543
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   544
     * ECMA 15.9.5.28 Date.prototype.setMilliseconds (ms)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   545
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   546
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   547
     * @param args milliseconds
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   548
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   549
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   550
    @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   551
    public static Object setMilliseconds(final Object self, final Object... args) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   552
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   553
        if (nd.isValidDate()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   554
            setFields(nd, MILLISECOND, args, true);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   555
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   556
        return nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   557
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   558
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   559
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   560
     * ECMA 15.9.5.29 Date.prototype.setUTCMilliseconds (ms)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   561
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   562
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   563
     * @param args utc milliseconds
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   564
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   565
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   566
    @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   567
    public static Object setUTCMilliseconds(final Object self, final Object... args) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   568
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   569
        if (nd.isValidDate()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   570
            setFields(nd, MILLISECOND, args, false);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   571
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   572
        return nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   573
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   574
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   575
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   576
     * ECMA 15.9.5.30 Date.prototype.setSeconds (sec [, ms ] )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   577
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   578
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   579
     * @param args seconds (milliseconds optional second argument)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   580
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   581
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   582
    @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 2)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   583
    public static Object setSeconds(final Object self, final Object... args) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   584
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   585
        if (nd.isValidDate()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   586
            setFields(nd, SECOND, args, true);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   587
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   588
        return nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   589
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   590
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   591
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   592
     * ECMA 15.9.5.31 Date.prototype.setUTCSeconds (sec [, ms ] )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   593
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   594
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   595
     * @param args UTC seconds (milliseconds optional second argument)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   596
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   597
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   598
    @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 2)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   599
    public static Object setUTCSeconds(final Object self, final Object... args) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   600
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   601
        if (nd.isValidDate()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   602
            setFields(nd, SECOND, args, false);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   603
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   604
        return nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   605
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   606
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   607
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   608
     * ECMA 15.9.5.32 Date.prototype.setMinutes (min [, sec [, ms ] ] )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   609
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   610
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   611
     * @param args minutes (seconds and milliseconds are optional second and third arguments)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   612
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   613
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   614
    @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 3)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   615
    public static Object setMinutes(final Object self, final Object... args) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   616
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   617
        if (nd.isValidDate()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   618
            setFields(nd, MINUTE, args, true);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   619
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   620
        return nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   621
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   622
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   623
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   624
     * ECMA 15.9.5.33 Date.prototype.setUTCMinutes (min [, sec [, ms ] ] )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   625
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   626
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   627
     * @param args minutes (seconds and milliseconds are optional second and third arguments)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   628
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   629
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   630
    @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 3)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   631
    public static Object setUTCMinutes(final Object self, final Object... args) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   632
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   633
        if (nd.isValidDate()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   634
            setFields(nd, MINUTE, args, false);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   635
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   636
        return nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   637
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   638
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   639
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   640
     * ECMA 15.9.5.34 Date.prototype.setHours (hour [, min [, sec [, ms ] ] ] )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   641
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   642
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   643
     * @param args hour (optional arguments after are minutes, seconds, milliseconds)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   644
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   645
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   646
    @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 4)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   647
    public static Object setHours(final Object self, final Object... args) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   648
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   649
        if (nd.isValidDate()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   650
            setFields(nd, HOUR, args, true);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   651
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   652
        return nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   653
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   654
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   655
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   656
     * ECMA 15.9.5.35 Date.prototype.setUTCHours (hour [, min [, sec [, ms ] ] ] )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   657
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   658
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   659
     * @param args hour (optional arguments after are minutes, seconds, milliseconds)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   660
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   661
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   662
    @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 4)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   663
    public static Object setUTCHours(final Object self, final Object... args) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   664
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   665
        if (nd.isValidDate()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   666
            setFields(nd, HOUR, args, false);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   667
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   668
        return nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   669
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   670
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   671
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   672
     * ECMA 15.9.5.36 Date.prototype.setDate (date)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   673
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   674
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   675
     * @param args date
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   676
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   677
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   678
    @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   679
    public static Object setDate(final Object self, final Object... args) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   680
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   681
        if (nd.isValidDate()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   682
            setFields(nd, DAY, args, true);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   683
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   684
        return nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   685
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   686
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   687
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   688
     * ECMA 15.9.5.37 Date.prototype.setUTCDate (date)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   689
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   690
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   691
     * @param args UTC date
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   692
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   693
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   694
    @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   695
    public static Object setUTCDate(final Object self, final Object... args) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   696
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   697
        if (nd.isValidDate()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   698
            setFields(nd, DAY, args, false);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   699
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   700
        return nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   701
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   702
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   703
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   704
     * ECMA 15.9.5.38 Date.prototype.setMonth (month [, date ] )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   705
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   706
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   707
     * @param args month (optional second argument is date)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   708
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   709
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   710
    @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 2)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   711
    public static Object setMonth(final Object self, final Object... args) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   712
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   713
        if (nd.isValidDate()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   714
            setFields(nd, MONTH, args, true);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   715
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   716
        return nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   717
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   718
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   719
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   720
     * ECMA 15.9.5.39 Date.prototype.setUTCMonth (month [, date ] )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   721
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   722
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   723
     * @param args UTC month (optional second argument is date)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   724
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   725
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   726
    @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 2)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   727
    public static Object setUTCMonth(final Object self, final Object... args) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   728
        final NativeDate nd = ensureNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   729
        if (nd.isValidDate()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   730
            setFields(nd, MONTH, args, false);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   731
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   732
        return nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   733
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   734
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   735
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   736
     * ECMA 15.9.5.40 Date.prototype.setFullYear (year [, month [, date ] ] )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   737
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   738
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   739
     * @param args year (optional second and third arguments are month and date)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   740
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   741
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   742
    @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 3)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   743
    public static Object setFullYear(final Object self, final Object... args) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   744
        final NativeDate nd   = ensureNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   745
        if (nd.isValidDate()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   746
            setFields(nd, YEAR, args, true);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   747
        } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   748
            final double[] d = convertArgs(args, 0, YEAR, YEAR, 3);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   749
            nd.setTime(timeClip(utc(makeDate(makeDay(d[0], d[1], d[2]), 0), nd.getTimeZone())));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   750
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   751
        return nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   752
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   753
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   754
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   755
     * ECMA 15.9.5.41 Date.prototype.setUTCFullYear (year [, month [, date ] ] )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   756
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   757
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   758
     * @param args UTC full year (optional second and third arguments are month and date)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   759
     * @return time
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   760
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   761
    @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 3)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   762
    public static Object setUTCFullYear(final Object self, final Object... args) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   763
        final NativeDate nd   = ensureNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   764
        if (nd.isValidDate()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   765
            setFields(nd, YEAR, args, false);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   766
        } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   767
            final double[] d = convertArgs(args, 0, YEAR, YEAR, 3);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   768
            nd.setTime(timeClip(makeDate(makeDay(d[0], d[1], d[2]), 0)));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   769
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   770
        return nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   771
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   772
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   773
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   774
     * ECMA B.2.5 Date.prototype.setYear (year)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   775
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   776
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   777
     * @param year year
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   778
     * @return NativeDate
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   779
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   780
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   781
    public static Object setYear(final Object self, final Object year) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   782
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   783
        if (isNaN(nd.getTime())) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   784
            return null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   785
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   786
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   787
        final double yearNum = JSType.toNumber(year);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   788
        if (isNaN(yearNum)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   789
            nd.setTime(NaN);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   790
            return nd;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   791
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   792
        int yearInt = JSType.toInteger(yearNum);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   793
        if (0 <= yearInt && yearInt <= 99) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   794
            yearInt += 1900;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   795
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   796
        setFields(nd, YEAR, new Object[] {yearInt}, true);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   797
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   798
        return nd;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   799
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   800
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   801
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   802
     * ECMA 15.9.5.42 Date.prototype.toUTCString ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   803
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   804
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   805
     * @return string representation of date
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   806
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   807
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   808
    public static Object toUTCString(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   809
        return toGMTStringImpl(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   810
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   811
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   812
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   813
     * ECMA B.2.6 Date.prototype.toGMTString ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   814
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   815
     * See {@link NativeDate#toUTCString(Object)}
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   816
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   817
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   818
     * @return string representation of date
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   819
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   820
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   821
    public static Object toGMTString(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   822
        return toGMTStringImpl(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   823
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   824
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   825
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   826
     * ECMA 15.9.5.43 Date.prototype.toISOString ( )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   827
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   828
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   829
     * @return string representation of date
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   830
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   831
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   832
    public static Object toISOString(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   833
        return toISOStringImpl(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   834
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   835
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   836
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   837
     * ECMA 15.9.5.44 Date.prototype.toJSON ( key )
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   838
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   839
     * Provides a string representation of this Date for use by {@link NativeJSON#stringify(Object, Object, Object, Object)}
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   840
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   841
     * @param self self reference
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   842
     * @param key ignored
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   843
     * @return JSON representation of this date
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   844
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   845
    @Function(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   846
    public static Object toJSON(final Object self, final Object key) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   847
        if (self instanceof NativeDate) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   848
            final NativeDate nd = (NativeDate)self;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   849
            return (isNaN(nd.getTime())) ? null : toISOStringImpl(nd);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   850
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   851
        // NOTE: Date.prototype.toJSON is generic. Accepts other objects as well.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   852
        final Object selfObj = Global.toObject(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   853
        if (!(selfObj instanceof ScriptObject)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   854
            return null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   855
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   856
        final ScriptObject sobj  = (ScriptObject)selfObj;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   857
        final Object       value = sobj.getDefaultValue(Number.class);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   858
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   859
        final double num = (value instanceof Number) ? ((Number)value).doubleValue() : NaN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   860
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   861
        if (isInfinite(num) || isNaN(num)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   862
            return null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   863
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   864
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   865
        try {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   866
            final Object func = TO_ISO_STRING.getGetter().invokeExact(sobj);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   867
            if (func instanceof ScriptFunction) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   868
                return TO_ISO_STRING.getInvoker().invokeExact(func, sobj, key);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   869
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   870
            typeError(Global.instance(), "not.a.function", ScriptRuntime.safeToString(func));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   871
        } catch (final RuntimeException | Error e) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   872
            throw e;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   873
        } catch (final Throwable t) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   874
            throw new RuntimeException(t);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   875
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   876
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   877
        return null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   878
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   879
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   880
    // -- Internals below this point
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   881
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   882
    private static double parseDateString(final String str) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   883
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   884
        final DateParser parser = new DateParser(str);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   885
        if (parser.parse()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   886
            final Integer[] fields = parser.getDateFields();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   887
            double d = makeDate(fields);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   888
            if (fields[DateParser.TIMEZONE] != null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   889
                d -= fields[DateParser.TIMEZONE] * 60000;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   890
            } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   891
                d = utc(d, Global.getThisContext().getTimeZone());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   892
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   893
            d = timeClip(d);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   894
            return d;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   895
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   896
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   897
        return Double.NaN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   898
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   899
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   900
    private static void zeroPad(final StringBuilder sb, final int n, final int length) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   901
        for (int l = 1, d = 10; l < length; l++, d *= 10) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   902
            if (n < d) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   903
                sb.append('0');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   904
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   905
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   906
        sb.append(n);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   907
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   908
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   909
    private static String toStringImpl(final Object self, final int format) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   910
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   911
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   912
        if (nd != null && nd.isValidDate()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   913
            final StringBuilder sb = new StringBuilder(40);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   914
            final double t = nd.getLocalTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   915
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   916
            switch (format) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   917
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   918
                case FORMAT_DATE_TIME:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   919
                case FORMAT_DATE :
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   920
                case FORMAT_LOCAL_DATE_TIME:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   921
                    // EEE MMM dd yyyy
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   922
                    sb.append(weekDays[(int) weekDay(t)])
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   923
                            .append(' ')
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   924
                            .append(months[(int) monthFromTime(t)])
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   925
                            .append(' ');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   926
                    zeroPad(sb, (int) dayFromTime(t), 2);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   927
                    sb.append(' ');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   928
                    zeroPad(sb, (int) yearFromTime(t), 4);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   929
                    if (format == FORMAT_DATE) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   930
                        break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   931
                    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   932
                    sb.append(' ');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   933
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   934
                    //$FALL-THROUGH$
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   935
                case FORMAT_TIME:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   936
                    final TimeZone tz = nd.getTimeZone();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   937
                    final double utcTime = nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   938
                    int offset = tz.getOffset((long) utcTime) / 60000;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   939
                    final boolean inDaylightTime = offset != tz.getRawOffset() / 60000;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   940
                    // Convert minutes to HHmm timezone offset
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   941
                    offset = (offset / 60) * 100 + offset % 60;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   942
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   943
                    // HH:mm:ss GMT+HHmm
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   944
                    zeroPad(sb, (int) hourFromTime(t), 2);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   945
                    sb.append(':');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   946
                    zeroPad(sb, (int) minFromTime(t), 2);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   947
                    sb.append(':');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   948
                    zeroPad(sb, (int) secFromTime(t), 2);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   949
                    sb.append(" GMT")
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   950
                            .append(offset < 0 ? '-' : '+');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   951
                    zeroPad(sb, Math.abs(offset), 4);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   952
                    sb.append(" (")
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   953
                            .append(tz.getDisplayName(inDaylightTime, TimeZone.SHORT, Locale.US))
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   954
                            .append(')');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   955
                    break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   956
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   957
                case FORMAT_LOCAL_DATE:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   958
                    // yyyy-MM-dd
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   959
                    zeroPad(sb, (int) yearFromTime(t), 4);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   960
                    sb.append('-');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   961
                    zeroPad(sb, (int) monthFromTime(t) + 1, 2);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   962
                    sb.append('-');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   963
                    zeroPad(sb, (int) dayFromTime(t), 2);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   964
                    break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   965
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   966
                case FORMAT_LOCAL_TIME:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   967
                    // HH:mm:ss
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   968
                    zeroPad(sb, (int) hourFromTime(t), 2);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   969
                    sb.append(':');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   970
                    zeroPad(sb, (int) minFromTime(t), 2);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   971
                    sb.append(':');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   972
                    zeroPad(sb, (int) secFromTime(t), 2);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   973
                    break;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   974
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   975
                default:
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   976
                    throw new IllegalArgumentException("format: " + format);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   977
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   978
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   979
            return sb.toString();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   980
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   981
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   982
        return INVALID_DATE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   983
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   984
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   985
    private static String toGMTStringImpl(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   986
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   987
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   988
        if (nd != null && nd.isValidDate()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   989
            final StringBuilder sb = new StringBuilder(29);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   990
            final double t = nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   991
            // EEE, dd MMM yyyy HH:mm:ss z
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   992
            sb.append(weekDays[(int) weekDay(t)])
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   993
                    .append(", ");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   994
            zeroPad(sb, (int) dayFromTime(t), 2);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   995
            sb.append(' ')
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   996
                    .append(months[(int) monthFromTime(t)])
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   997
                    .append(' ');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   998
            zeroPad(sb, (int) yearFromTime(t), 4);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   999
            sb.append(' ');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1000
            zeroPad(sb, (int) hourFromTime(t), 2);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1001
            sb.append(':');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1002
            zeroPad(sb, (int) minFromTime(t), 2);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1003
            sb.append(':');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1004
            zeroPad(sb, (int) secFromTime(t), 2);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1005
            sb.append(" GMT");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1006
            return sb.toString();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1007
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1008
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1009
        rangeError(Global.instance(), "invalid.date");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1010
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1011
        return INVALID_DATE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1012
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1013
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1014
    private static String toISOStringImpl(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1015
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1016
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1017
        if (nd != null && nd.isValidDate()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1018
            final StringBuilder sb = new StringBuilder(24);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1019
            final double t = nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1020
            // yyyy-MM-dd'T'HH:mm:ss.SSS'Z'
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1021
            zeroPad(sb, (int) yearFromTime(t), 4);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1022
            sb.append('-');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1023
            zeroPad(sb, (int) monthFromTime(t) + 1, 2);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1024
            sb.append('-');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1025
            zeroPad(sb, (int) dayFromTime(t), 2);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1026
            sb.append('T');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1027
            zeroPad(sb, (int) hourFromTime(t), 2);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1028
            sb.append(':');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1029
            zeroPad(sb, (int) minFromTime(t), 2);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1030
            sb.append(':');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1031
            zeroPad(sb, (int) secFromTime(t), 2);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1032
            sb.append('.');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1033
            zeroPad(sb, (int) msFromTime(t), 3);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1034
            sb.append("Z");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1035
            return sb.toString();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1036
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1037
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1038
        rangeError(Global.instance(), "invalid.date");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1039
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1040
        return INVALID_DATE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1041
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1042
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1043
    // ECMA 15.9.1.2 Day (t)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1044
    private static double day(final double t) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1045
        return Math.floor(t / msPerDay);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1046
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1047
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1048
    // ECMA 15.9.1.2 TimeWithinDay (t)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1049
    private static double timeWithinDay(final double t) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1050
        return t % msPerDay;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1051
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1052
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1053
    // ECMA 15.9.1.3 InLeapYear (t)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1054
    private static boolean isLeapYear(final int y) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1055
        return y % 4 == 0 && (y % 100 != 0 || y % 400 == 0);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1056
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1057
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1058
    // ECMA 15.9.1.3 DaysInYear (y)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1059
    private static int daysInYear(final int y) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1060
        return isLeapYear(y) ? 366 : 365;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1061
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1062
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1063
    // ECMA 15.9.1.3 DayFromYear (y)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1064
    private static double dayFromYear(final double y) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1065
        return 365 * (y - 1970)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1066
                + Math.floor((y -1969) / 4.0)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1067
                - Math.floor((y - 1901) / 100.0)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1068
                + Math.floor((y - 1601) / 400.0);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1069
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1070
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1071
    // ECMA 15.9.1.3 Year Number
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1072
    private static double timeFromYear(final double y) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1073
        return dayFromYear(y) * msPerDay;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1074
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1075
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1076
    private static double yearFromTime(final double t) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1077
        double y = Math.floor(t / (msPerDay * 365.2425)) + 1970;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1078
        final double t2 = timeFromYear(y);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1079
        if (t2 > t) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1080
            y--;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1081
        } else if (t2 + msPerDay * daysInYear((int) y) <= t) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1082
            y++;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1083
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1084
        return y;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1085
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1086
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1087
    private static double dayWithinYear(final double t, final double year) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1088
        return day(t) - dayFromYear(year);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1089
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1090
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1091
    private static double monthFromTime(final double t) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1092
        final double year = yearFromTime(t);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1093
        final double day = dayWithinYear(t, year);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1094
        final int[] firstDay = firstDayInMonth[isLeapYear((int) year) ? 1 : 0];
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1095
        int month = 0;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1096
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1097
        while (month < 11 && firstDay[month + 1] <= day) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1098
            month++;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1099
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1100
        return month;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1101
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1102
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1103
    private static double dayFromTime(final double t)  {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1104
        final double year = yearFromTime(t);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1105
        final double day = dayWithinYear(t, year);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1106
        final int[] firstDay = firstDayInMonth[isLeapYear((int) year) ? 1 : 0];
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1107
        int month = 0;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1108
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1109
        while (month < 11 && firstDay[month + 1] <= day) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1110
            month++;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1111
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1112
        return 1 + day - firstDay[month];
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1113
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1114
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1115
    private static int dayFromMonth(final int month, final int year) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1116
        assert(month >= 0 && month <= 11);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1117
        final int[] firstDay = firstDayInMonth[isLeapYear(year) ? 1 : 0];
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1118
        return firstDay[month];
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1119
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1120
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1121
    private static double weekDay(final double time) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1122
        if (isNaN(time)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1123
            return NaN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1124
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1125
        final double day = (day(time) + 4) % 7;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1126
        return day < 0 ? day + 7 : day;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1127
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1128
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1129
    // ECMA 15.9.1.9 LocalTime
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1130
    private static double localTime(final double time, final TimeZone tz) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1131
        return time + tz.getOffset((long) time);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1132
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1133
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1134
    // ECMA 15.9.1.9 UTC
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1135
    private static double utc(final double time, final TimeZone tz) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1136
        return time - tz.getOffset((long) (time - tz.getRawOffset()));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1137
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1138
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1139
    // ECMA 15.9.1.10 Hours, Minutes, Second, and Milliseconds
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1140
    private static double hourFromTime(final double t) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1141
        final double h = Math.floor(t / msPerHour) % hoursPerDay;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1142
        return h < 0 ? h + hoursPerDay: h;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1143
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1144
    private static double minFromTime(final double t) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1145
        final double m = Math.floor(t / msPerMinute) % minutesPerHour;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1146
        return m < 0 ? m + minutesPerHour : m;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1147
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1148
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1149
    private static double secFromTime(final double t) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1150
        final double s = Math.floor(t / msPerSecond) % secondsPerMinute;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1151
        return s < 0 ? s + secondsPerMinute : s;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1152
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1153
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1154
    private static double msFromTime(final double t) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1155
        final double m = t % msPerSecond;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1156
        return m < 0 ? m + msPerSecond : m;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1157
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1158
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1159
    private static double valueFromTime(final int unit, final double t) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1160
        switch (unit) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1161
            case YEAR: return yearFromTime(t);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1162
            case MONTH: return monthFromTime(t);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1163
            case DAY: return dayFromTime(t);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1164
            case HOUR: return hourFromTime(t);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1165
            case MINUTE: return minFromTime(t);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1166
            case SECOND: return secFromTime(t);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1167
            case MILLISECOND: return msFromTime(t);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1168
            default: throw new IllegalArgumentException(Integer.toString(unit));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1169
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1170
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1171
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1172
    // ECMA 15.9.1.11 MakeTime (hour, min, sec, ms)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1173
    private static double makeTime(final double hour, final double min, final double sec, final double ms) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1174
        return hour * 3600000 + min * 60000 + sec * 1000 + ms;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1175
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1176
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1177
    // ECMA 15.9.1.12 MakeDay (year, month, date)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1178
    private static double makeDay(final double year, final double month, final double date) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1179
        final double y = year + Math.floor(month / 12);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1180
        double m = month % 12;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1181
        if (m < 0) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1182
            m += 12;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1183
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1184
        double d = Math.floor(dayFromYear(y));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1185
        d += dayFromMonth((int) m, (int) y);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1186
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1187
        return d + date - 1;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1188
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1189
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1190
    // ECMA 15.9.1.13 MakeDate (day, time)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1191
    private static double makeDate(final double day, final double time) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1192
        return day * msPerDay + time;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1193
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1194
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1195
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1196
    private static double makeDate(final Integer[] d) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1197
        final double time = makeDay(d[0], d[1], d[2]) * msPerDay;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1198
        return time + makeTime(d[3], d[4], d[5], d[6]);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1199
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1200
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1201
    private static double makeDate(final double[] d) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1202
        final double time = makeDay(d[0], d[1], d[2]) * msPerDay;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1203
        return time + makeTime(d[3], d[4], d[5], d[6]);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1204
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1205
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1206
    // Convert Date constructor args, checking for NaN, filling in defaults etc.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1207
    private static double[] convertCtorArgs(final Object[] args) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1208
        final double[] d = new double[7];
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1209
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1210
        for (int i = 0; i < d.length; i++) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1211
            if (i < args.length) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1212
                final double darg = JSType.toNumber(args[i]);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1213
                if (isNaN(darg) || isInfinite(darg)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1214
                    return null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1215
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1216
                d[i] = (long)darg;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1217
            } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1218
                d[i] = i == 2 ? 1 : 0; // day in month defaults to 1
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1219
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1220
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1221
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1222
        if (0 <= d[0] && d[0] <= 99) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1223
            d[0] += 1900;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1224
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1225
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1226
        return d;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1227
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1228
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1229
    // This method does the hard work for all setter methods: If a value is provided
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1230
    // as argument it is used, otherwise the value is calculated from the existing time value.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1231
    private static double[] convertArgs(final Object[] args, final double time, final int fieldId, final int start, final int length) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1232
        final double[] d = new double[length];
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1233
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1234
        for (int i = start; i < start + length; i++) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1235
            if (fieldId <= i && i < fieldId + args.length) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1236
                final double darg = JSType.toNumber(args[i - fieldId]);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1237
                if (isNaN(darg) || isInfinite(darg)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1238
                    return null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1239
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1240
                d[i - start] = (long) darg;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1241
            } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1242
                // Date.prototype.set* methods require first argument to be defined
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1243
                if (i == fieldId) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1244
                    return null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1245
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1246
                d[i - start] = valueFromTime(i, time);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1247
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1248
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1249
        return d;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1250
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1251
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1252
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1253
    // ECMA 15.9.1.14 TimeClip (time)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1254
    private static double timeClip(final double time) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1255
        if (isInfinite(time) || isNaN(time) || Math.abs(time) > 8.64e15) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1256
            return Double.NaN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1257
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1258
        return (long)time;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1259
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1260
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1261
    private static NativeDate ensureNativeDate(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1262
        return getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1263
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1264
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1265
    private static NativeDate getNativeDate(final Object self) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1266
        if (self instanceof NativeDate) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1267
            return (NativeDate)self;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1268
        } else if (self != null && self == Global.instance().getDatePrototype()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1269
            return Global.instance().DEFAULT_DATE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1270
        } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1271
            typeError(Global.instance(), "not.a.date", ScriptRuntime.safeToString(self));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1272
            return null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1273
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1274
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1275
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1276
    private static Object getField(final Object self, final int field) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1277
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1278
        return (nd != null && nd.isValidDate()) ? valueFromTime(field, nd.getLocalTime()) : Double.NaN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1279
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1280
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1281
    private static Object getUTCField(final Object self, final int field) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1282
        final NativeDate nd = getNativeDate(self);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1283
        return (nd != null && nd.isValidDate()) ? valueFromTime(field, nd.getTime()) : Double.NaN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1284
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1285
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1286
    private static void setFields(final NativeDate nd, final int fieldId, final Object[] args, final boolean local) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1287
        int start, length;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1288
        if (fieldId < HOUR) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1289
            start = YEAR;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1290
            length = 3;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1291
        } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1292
            start = HOUR;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1293
            length = 4;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1294
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1295
        final double time = local ? nd.getLocalTime() : nd.getTime();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1296
        final double d[] = convertArgs(args, time, fieldId, start, length);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1297
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1298
        double newTime;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1299
        if (d == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1300
            newTime = NaN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1301
        } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1302
            if (start == YEAR) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1303
                newTime = makeDate(makeDay(d[0], d[1], d[2]), timeWithinDay(time));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1304
            } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1305
                newTime = makeDate(day(time), makeTime(d[0], d[1], d[2], d[3]));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1306
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1307
            if (local) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1308
                newTime = utc(newTime, nd.getTimeZone());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1309
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1310
            newTime = timeClip(newTime);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1311
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1312
        nd.setTime(newTime);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1313
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1314
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1315
    private boolean isValidDate() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1316
        return !isNaN(time);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1317
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1318
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1319
    private double getLocalTime() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1320
        return localTime(time, timezone);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1321
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1322
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1323
    private double getTime() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1324
        return time;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1325
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1326
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1327
    private void setTime(final double time) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1328
        this.time = time;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1329
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1330
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1331
    private TimeZone getTimeZone() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1332
        return timezone;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1333
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1334
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1335
}