Skip to content

Commit 9125c4d

Browse files
Fix week number calculation. Closes #92.
1 parent 09ecdef commit 9125c4d

File tree

2 files changed

+44
-6
lines changed

2 files changed

+44
-6
lines changed

lua/orgmode/objects/date.lua

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -733,13 +733,22 @@ end
733733

734734
---@return number
735735
function Date:get_week_number()
736-
local start_of_year = self:start_of('year')
737-
local week = 1
738-
while start_of_year.timestamp < self.timestamp do
739-
start_of_year = start_of_year:add({ week = 1 })
740-
week = week + 1
736+
local first_week_start = self:start_of('year')
737+
local is_first_week = self:is_same(first_week_start, 'week')
738+
if is_first_week then
739+
if first_week_start:get_isoweekday() <= 4 then
740+
return 1
741+
end
742+
first_week_start = first_week_start:subtract({ year = 1 })
743+
end
744+
-- If there are no at least 4 days in the first week, it belongs to previous year
745+
if first_week_start:get_isoweekday() > 4 then
746+
first_week_start = first_week_start:add({ week = 1 })
741747
end
742-
return week
748+
first_week_start = first_week_start:start_of('week')
749+
local this_week_start = self:start_of('week')
750+
local number_of_days = math.ceil((this_week_start.timestamp - first_week_start.timestamp) / (24 * 60 * 60))
751+
return math.floor(number_of_days / 7) + 1
743752
end
744753

745754
---@param line string

tests/plenary/object/date_spec.lua

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -738,4 +738,33 @@ describe('Date object', function()
738738
to = Date.from_string('2021-12-07 Mon 12:35')
739739
assert.are.same(155, to:diff(from, 'minute'))
740740
end)
741+
742+
it('should properly calculate week number', function()
743+
local first = Date.from_string('2021-09-19')
744+
assert.are.same(37, first:get_week_number())
745+
746+
local start_of_2020 = Date.from_string('2020-01-01')
747+
assert.are.same(1, start_of_2020:get_week_number())
748+
749+
local february_2020 = Date.from_string('2020-02-28')
750+
assert.are.same(9, february_2020:get_week_number())
751+
752+
local november_2020 = Date.from_string('2020-11-30')
753+
assert.are.same(49, november_2020:get_week_number())
754+
755+
local end_of_2020 = Date.from_string('2020-12-31')
756+
assert.are.same(53, end_of_2020:get_week_number())
757+
758+
local start_of_2021 = Date.from_string('2021-01-01')
759+
assert.are.same(53, start_of_2021:get_week_number())
760+
761+
local february_2021 = Date.from_string('2021-02-28')
762+
assert.are.same(8, february_2021:get_week_number())
763+
764+
local august_2021 = Date.from_string('2021-08-31')
765+
assert.are.same(35, august_2021:get_week_number())
766+
767+
local end_of_2021 = Date.from_string('2021-12-31')
768+
assert.are.same(52, end_of_2021:get_week_number())
769+
end)
741770
end)

0 commit comments

Comments
 (0)