from browser import window import javascript # use Javascript Date constructor date = javascript.JSConstructor(window.Date) #daylight = 0 # fix me.. returns Non zero if DST timezone is defined ############################################## # Added to pass some tests # Are there timezone always in the browser? # I'm assuming we don't have always this info _STRUCT_TM_ITEMS = 9 ############################################## ############################################## ## Helper functions def _get_day_of_year(arg): """ Get the day position in the year starting from 1 Parameters ---------- arg : tuple Returns ------- int with the correct day of the year starting from 1 """ ml = [31,28,31,30,31,30,31,31,30,31,30,31] if arg[0]%4==0: ml[1] += 1 i=1 yday=0 while i mm > 13: raise ValueError("month out of range") dd = t[2] if dd == 0: dd = 1 if -1 > dd > 32: raise ValueError("day of month out of range") hh = t[3] if -1 > hh > 24: raise ValueError("hour out of range") minu = t[4] if -1 > minu > 60: raise ValueError("minute out of range") ss = t[5] if -1 > ss > 62: raise ValueError("seconds out of range") wd = t[6] % 7 if wd < -2: raise ValueError("day of week out of range") dy = t[7] if dy == 0: dy = 1 if -1 > dy > 367: raise ValueError("day of year out of range") return t[0], mm, dd, hh, minu, ss, wd, dy, t[-1] def _is_dst(secs = None): "Check if data has daylight saving time" d = date() if secs is not None: d = date(secs*1000) # calculate if we are in daylight savings time or not. # borrowed from http://stackoverflow.com/questions/11887934/check-if-daylight-saving-time-is-in-effect-and-if-it-is-for-how-many-hours jan = date(d.getFullYear(), 0, 1) jul = date(d.getFullYear(), 6, 1) dst = int(d.getTimezoneOffset() < max(abs(jan.getTimezoneOffset()), abs(jul.getTimezoneOffset()))) return dst def _get_tzname(): "check if timezone is available, if not return a tuple of empty str" d = date() d = d.toTimeString() try: d = d.split('(')[1].split(')')[0] return (d, 'NotAvailable') except: return ('', '') def _set_altzone(): d = date() jan = date(d.getFullYear(), 0, 1) jul = date(d.getFullYear(), 6, 1) result = timezone - (jan.getTimezoneOffset() - jul.getTimezoneOffset()) * 60 return result def _check_input(t): if t and isinstance(t, struct_time) and len(t.args) == 9: t = t.args elif t and isinstance(t, tuple) and len(t) == 9: t = t elif t and isinstance(t, struct_time) and len(t.args) != 9: raise TypeError("function takes exactly 9 arguments ({} given)".format(len(t.args))) elif t and isinstance(t, tuple) and len(t) != 9: raise TypeError("function takes exactly 9 arguments ({} given)".format(len(t.args))) elif t and not isinstance(t, (tuple, struct_time)): raise TypeError("Tuple or struct_time argument required") else: t = localtime().args return t ## end of helper functions ############################################## ############################################## ## Values depending the timezone of the browser. daylight = _is_dst() timezone = date().getTimezoneOffset() * 60 tzname = _get_tzname() altzone = _set_altzone() if daylight else timezone ############################################## def asctime(t = None): weekdays = {0: "Mon", 1: "Tue", 2: "Wed", 3: "Thu", 4: "Fri", 5: "Sat", 6: "Sun"} months = {1:'Jan',2:'Feb',3:'Mar',4:'Apr',5:'May',6:'Jun', 7:'Jul',8:'Aug',9:'Sep',10:'Oct',11:'Nov',12:'Dec'} t = _check_input(t) t = _check_struct_time(t) result = "%s %s %2d %02d:%02d:%02d %d" % ( weekdays[t[6]], months[t[1]], t[2], t[3], t[4], t[5], t[0]) return result def ctime(timestamp=None): return asctime(localtime(timestamp)) def gmtime(secs = None): d = date() if secs is not None: d = date(secs*1000) wday = d.getUTCDay() - 1 if d.getUTCDay() - 1 >= 0 else 6 tmp = struct_time([d.getUTCFullYear(), d.getUTCMonth()+1, d.getUTCDate(), d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds(), wday, 0, 0]) tmp.args[7] = _get_day_of_year(tmp.args) return tmp def localtime(secs = None): d = date() if secs is not None: d = date(secs * 1000) dst = _is_dst(secs) wday = d.getDay() - 1 if d.getDay() - 1 >= 0 else 6 tmp = struct_time([d.getFullYear(), d.getMonth()+1, d.getDate(), d.getHours(), d.getMinutes(), d.getSeconds(), wday, 0, dst]) tmp.args[7] = _get_day_of_year(tmp.args) return tmp def mktime(t): if isinstance(t, struct_time): d1 = date(t.tm_year, t.tm_mon - 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec, 0).getTime() elif isinstance(t, tuple): d1 = date(t[0], t[1] - 1, t[2], t[3], t[4], t[5], 0).getTime() else: raise ValueError("Tuple or struct_time argument required") d2 = date(0).getTime() return (d1 - d2) / 1000. def monotonic(): return javascript.JSObject(window.performance.now)()/1000. def perf_counter(): return float(date().getTime()/1000.0) def time(): return float(date().getTime()/1000) def sleep(secs): """Javascript can't block execution for a given time, expect by an infinite loop that freezes the browser. It's better to raise an exception""" #start = date().getTime() #while date().getTime() - start < secs * 1000.: # pass raise NotImplementedError("Blocking functions like time.sleep() are not " "supported in the browser. Use functions in module browser.timer " "instead.") def strftime(_format,t = None): def ns(t,nb): # left padding with 0 res = str(t) while len(res)