/* * Copyright (c) 2020, Linus Groh * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include namespace JS { Date* Date::create(GlobalObject& global_object, Core::DateTime datetime, u16 milliseconds) { return global_object.heap().allocate(global_object, datetime, milliseconds, *global_object.date_prototype()); } Date::Date(Core::DateTime datetime, u16 milliseconds, Object& prototype) : Object(prototype) , m_datetime(datetime) , m_milliseconds(milliseconds) { } Date::~Date() { } tm Date::to_utc_tm() const { time_t timestamp = m_datetime.timestamp(); struct tm tm; gmtime_r(×tamp, &tm); return tm; } int Date::utc_date() const { return to_utc_tm().tm_mday; } int Date::utc_day() const { return to_utc_tm().tm_wday; } int Date::utc_full_year() const { return to_utc_tm().tm_year + 1900; } int Date::utc_hours() const { return to_utc_tm().tm_hour; } int Date::utc_minutes() const { return to_utc_tm().tm_min; } int Date::utc_month() const { return to_utc_tm().tm_mon; } int Date::utc_seconds() const { return to_utc_tm().tm_sec; } String Date::iso_date_string() const { auto tm = to_utc_tm(); int year = tm.tm_year + 1900; int month = tm.tm_mon + 1; StringBuilder builder; if (year < 0) builder.appendf("-%06d", -year); else if (year > 9999) builder.appendf("+%06d", year); else builder.appendf("%04d", year); builder.append('-'); builder.appendf("%02d", month); builder.append('-'); builder.appendf("%02d", tm.tm_mday); builder.append('T'); builder.appendf("%02d", tm.tm_hour); builder.append(':'); builder.appendf("%02d", tm.tm_min); builder.append(':'); builder.appendf("%02d", tm.tm_sec); builder.append('.'); builder.appendf("%03d", m_milliseconds); builder.append('Z'); return builder.build(); } }