Skip to content

Instantly share code, notes, and snippets.

@vol4ok
Created December 10, 2012 10:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vol4ok/4249910 to your computer and use it in GitHub Desktop.
Save vol4ok/4249910 to your computer and use it in GitHub Desktop.
getStartOfWeek
DAY = 86400000
getStartOfWeek = (t) ->
UTC3_OFFSET = 60*60*3
kDays4Years = [0, 365, 2 * 365, 3 * 365 + 1]
kDaysIn4Years = 4 * 365 + 1
kDaysIn100Years = 25 * kDaysIn4Years - 1
kDaysIn400Years = 4 * kDaysIn100Years + 1
kDays1970to2000 = 30 * 365 + 7
kDaysOffset = 1000 * kDaysIn400Years + 5 * kDaysIn400Years - kDays1970to2000
kYearsOffset = 400000
kDaysInMonths = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
monthCodes = [5,1,1,4,6,2,4,0,3,5,1,3]
t = Date.now() unless t
saveDays = days = Math.floor(t / DAY)
year = 0
day = 0
month = 0
days += kDaysOffset
year = 400 * Math.floor(days / kDaysIn400Years) - kYearsOffset
days %= kDaysIn400Years
days--
yd1 = Math.floor(days / kDaysIn100Years)
days %= kDaysIn100Years
year += 100 * yd1
days++
yd2 = Math.floor(days / kDaysIn4Years)
days %= kDaysIn4Years
year += 4 * yd2
days--
yd3 = Math.floor(days / 365)
days %= 365
year += yd3
is_leap = (!yd1 or yd2) and !yd3
if days >= 31 + 28 + is_leap
days -= 31 + 28 + is_leap
for i in [2...12]
if days < kDaysInMonths[i]
month = i
day = days + 1
break
days -= kDaysInMonths[i]
else
if days < 31
month = 0
day = days + 1
else
month = 1
day = days - 31 + 1
m = month + 1
d = day + 1
y = year % 100
c = Math.floor(year/100)
if (year%4 == 0) && (year%100 != 0 || year%400 == 0) && (m==1 || m==2)
isLeapJanFeb = 1
else
isLeapJanFeb = 0
w = Math.floor(1*d + 1*monthCodes[m-1] + 1*y + 1*Math.floor(y/4) - 2*(c%4) - 1*isLeapJanFeb) % 7
return (saveDays - w) * DAY
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment