Как разобрать неделю и год с помощью strptime - PullRequest
0 голосов
/ 08 февраля 2020

Обычно у меня нет проблем с разбором строк в Time в Rails, однако я не могу понять, почему он ведет себя так:

irb(main):073:0> DateTime.strptime("20/2020", "%V/%Y")
=> Wed, 01 Jan 2020 00:00:00 +0000

Я хочу 20-ю неделю 2020 года, а не 1-го января .. .

Ответы [ 3 ]

1 голос
/ 08 февраля 2020
require 'date'

Если неделя 1 начинается в воскресенье:

Date.strptime("20/2020", "%U/%Y")
  #=> #<Date: 2020-05-17 ((2458987j,0s,0n),+0s,2299161j)> 

и в понедельник:

d = Date.strptime("20/2020", "%W/%Y")
  #=> #<Date: 2020-05-18 ((2458988j,0s,0n),+0s,2299161j)> 

, а также из do c Date # strftime (который содержит директивы форматирования для Date :: strptime ), "Дни в году до первой недели относятся к неделе 0".

1 голос
/ 08 февраля 2020

Я думаю, что вам нужно использовать метод commercial.

require 'date'

week = 20
start_week = Date.commercial(2020, week)
# => Mon, 11 May 2020

puts "#{start_week}"
# => 2020-05-11

Если вам нужен Range, вы можете сделать:

Date.commercial(2020, week).all_week
# => Mon, 11 May 2020..Sun, 17 May 2020

Для получения дополнительной информации см. Документацию.

0 голосов
/ 08 февраля 2020

Как правило, существует разница между %Y и %G для года в зависимости от вашего предполагаемого определения номера недели.

Для ISO 8601 недель (которые обычно используются, например, в Европе), вы здесь нужно использовать недельный год (%G), а не дневной год (%Y). Это важно по краям лет. Например, 2021-01-01 относится к 53 неделе 2020 года. В эту дату

  • %G равно 2020, но
  • %Y уже 2021

Если вы хотите проанализировать неделю ISO 8601, вы можете использовать следующий код, чтобы убедиться, что вы используете правильную неделю и год:

require 'date'
DateTime.strptime("20/2020", "%V/%G")
# => #<DateTime: 2020-05-11T00:00:00+00:00 ((2458981j,0s,0n),+0s,2299161j)>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...