From 866e47ec5458c26296dc8296888d686535d57030 Mon Sep 17 00:00:00 2001 From: Kyle Luce Date: Thu, 3 Mar 2016 23:31:27 -0700 Subject: [PATCH] Added epoc to dictionary converter Useful for when user is storing time as epoc and wants to do operations on this time and then display in human readable form https://www.facebook.com/groups/godotengine/permalink/737469773056286/?comment_id=738011009668829&reply_comment_id=738192799650650¬if_t=group_comment_reply --- core/bind/core_bind.cpp | 75 +++++++++++++++++++++++++++++++++++++++-- core/bind/core_bind.h | 1 + 2 files changed, 73 insertions(+), 3 deletions(-) diff --git a/core/bind/core_bind.cpp b/core/bind/core_bind.cpp index aff047177c2..17f30bc8835 100644 --- a/core/bind/core_bind.cpp +++ b/core/bind/core_bind.cpp @@ -6,6 +6,15 @@ #include "core/globals.h" #include "io/file_access_encrypted.h" #include "os/keyboard.h" + +/** + * Time constants borrowed from loc_time.h + */ +#define EPOCH_YR 1970 /* EPOCH = Jan 1 1970 00:00:00 */ +#define SECS_DAY (24L * 60L * 60L) +#define LEAPYEAR(year) (!((year) % 4) && (((year) % 100) || !((year) % 400))) +#define YEARSIZE(year) (LEAPYEAR(year) ? 366 : 365) + _ResourceLoader *_ResourceLoader::singleton=NULL; Ref _ResourceLoader::load_interactive(const String& p_path,const String& p_type_hint) { @@ -479,9 +488,8 @@ Dictionary _OS::get_date(bool utc) const { dated["weekday"]=date.weekday; dated["dst"]=date.dst; return dated; - - } + Dictionary _OS::get_time(bool utc) const { OS::Time time = OS::get_singleton()->get_time(utc); @@ -490,7 +498,67 @@ Dictionary _OS::get_time(bool utc) const { timed["minute"]=time.min; timed["second"]=time.sec; return timed; +} +/** + * Get a dictionary of time values when given epoc time + * + * Dictionary Time values will be a union if values from #get_time + * and #get_date dictionaries (with the exception of dst = + * day light standard time, as it cannot be determined from epoc) + */ +Dictionary _OS::get_time_from_unix_time( uint64_t unix_time_val) const { + + OS::Date date; + OS::Time time; + + unsigned long dayclock, dayno; + int year = EPOCH_YR; + + dayclock = (unsigned long)unix_time_val % SECS_DAY; + dayno = (unsigned long)unix_time_val / SECS_DAY; + + time.sec = dayclock % 60; + time.min = (dayclock % 3600) / 60; + time.hour = dayclock / 3600; + + /* day 0 was a thursday */ + date.weekday = static_cast((dayno + 4) % 7); + + while (dayno >= YEARSIZE(year)) { + dayno -= YEARSIZE(year); + year++; + } + + date.year = year; + + // Table of number of days in each month (for regular year and leap year) + const unsigned int _ytab[2][12] = { + { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, + { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } + }; + + size_t imonth = 0; + + while (dayno >= _ytab[LEAPYEAR(year)][imonth]) { + dayno -= _ytab[LEAPYEAR(year)][imonth]; + imonth++; + } + + date.month = static_cast(imonth); + + date.day = dayno + 1; + + Dictionary timed; + timed["hour"]=time.hour; + timed["minute"]=time.min; + timed["second"]=time.sec; + timed["year"]=date.year; + timed["month"]=date.month; + timed["day"]=date.day; + timed["weekday"]=date.weekday; + + return timed; } Dictionary _OS::get_time_zone_info() const { @@ -837,6 +905,8 @@ void _OS::_bind_methods() { ObjectTypeDB::bind_method(_MD("get_time","utc"),&_OS::get_time,DEFVAL(false)); ObjectTypeDB::bind_method(_MD("get_time_zone_info"),&_OS::get_time_zone_info); ObjectTypeDB::bind_method(_MD("get_unix_time"),&_OS::get_unix_time); + ObjectTypeDB::bind_method(_MD("get_time_from_unix_time", "unix_time_val"), + &_OS::get_time_from_unix_time); ObjectTypeDB::bind_method(_MD("get_system_time_secs"), &_OS::get_system_time_secs); ObjectTypeDB::bind_method(_MD("set_icon","icon"),&_OS::set_icon); @@ -1985,7 +2055,6 @@ String _Thread::get_id() const { return itos(thread->get_ID()); } - bool _Thread::is_active() const { return active; diff --git a/core/bind/core_bind.h b/core/bind/core_bind.h index 2c43390d3c4..2fce33e67f1 100644 --- a/core/bind/core_bind.h +++ b/core/bind/core_bind.h @@ -208,6 +208,7 @@ public: void set_icon(const Image& p_icon); Dictionary get_date(bool utc) const; Dictionary get_time(bool utc) const; + Dictionary get_time_from_unix_time(uint64_t unix_time_val) const; Dictionary get_time_zone_info() const; uint64_t get_unix_time() const; uint64_t get_system_time_secs() const;