Подтвердить что ты не робот

Как понять strptime vs. strftime

В чем разница между strptime и strftime? Я вижу, что strptime - это метод в классе DateTime, а strftime - метод в классе Time.

  • В чем разница между Time и DateTime, кроме того, что у них разные методы ядра? Объяснение класса Time в документах Ruby полезно, но одно для DateTime просто говорит "datetime". Также существует класс Date, в котором говорится, что он предоставляет Date и DateTime. Помогите мне понять это.
  • Я вижу strptime, и я хочу произнести его "strip time", но это не имеет смысла. Есть ли для меня хорошее мнемоническое устройство?
  • Что означают strptime и strftime?
  • Как вы помните, что делает что?
4b9b3361

Ответ 1

Разница между Time и DateTime связана с реализацией. Большая часть функциональности DateTime происходит из мира Rails и является произвольной датой с указанием времени суток. Это больше из календарной системы. Time измеряется в секундах с 1 января 1970 года по Гринвичу и не зависит от часового пояса. В некоторых системах оно ограничено значениями между 1901 и 2038, ограничение того, как традиционно это значение хранится как 32-разрядное целое число со знаком, но более новые версии Ruby могут обрабатывать гораздо более широкий диапазон, используя 64-разрядное значение или BigNum. как требуется.

Короче говоря, DateTime - это то, что вы получаете из базы данных в Rails, где Time - это то, что Ruby традиционно использует. Если вы работаете со значениями, для которых важны даты, и вы хотите знать такие вещи, как конец месяца или какой день будет через шесть недель, используйте DateTime. Если вы просто измеряете прошедшее время и не заботитесь об этом, используйте Время. Их легко конвертировать при необходимости.

Date с другой стороны, является просто календарной датой и не имеет связанных времен. Вы можете использовать их там, где время не имеет значения.

strptime - это сокращение от "времени разбора", а strftime - от "времени форматирования". То есть strptime является противоположностью strftime хотя для удобства они используют одну и ту же спецификацию форматирования. Я редко видел, strptime используется strptime поскольку DateTime.parse обычно хорошо strptime что происходит, но если вам действительно нужно разобраться в этом, во что бы то ни стало, используйте устаревший парсер.

Ответ 2

strptime означает анализатор строк, он преобразует формат строки в дату и время.

Пример: -

       

datetime.strptime('2019-08-09 01:01:01', "%Y-%m-%d %H:%M:%S")

         

datetime.datetime(2019, 8, 9, 1, 1, 1)//Result

  

strftime означает форматирование строки, это отформатирует объект datetime в формат строки.

Пример: -

       

sample_date=datetime.strptime('2019-08-09 01:01:01', "%Y-%m-%d %H:%M:%S")

         

datetime.strftime(sample_date, "%Y-%d-%m %H:%M:%S")

         

'2019-09-08 01:01:01'//Result

  

Ответ 3

Я прочитал приведенный выше ответ, и в нем четко разграничены время, дата и время в рубине.

Время упаковано с Ruby. Он измеряется в секундах с 1 января 1970 года по Гринвичу и не зависит от часового пояса. В частности, класс Time хранит целые числа, которые представляют интервалы в секундах с начала эпохи. Мы можем думать об этом как Unix Time. У него есть некоторые ограничения. Я читаю где-то, если хранится как 64-разрядное целое число со знаком, оно может представлять даты между 1823-11-12 и 2116-02-20, но в моей системе оно может представлять даты вне этого диапазона. Если вы не укажете часовой пояс для использования в переменной среды ENV ['TZ'], то по умолчанию будет использоваться системное время, которое находится в /etc/localtime в Unix-подобных системах. Когда использовать время? Это полезно для измерения прошедшего времени или интерполяции метки времени в строковое значение.

Rails фактически расширяет класс Time. Это достигается через ActiveSupport :: TimeWithZone. Он обеспечивает поддержку настраиваемых часовых поясов. Примечание. Rails всегда преобразует часовой пояс в UTC перед тем, как записывать или считывать данные из базы данных, независимо от того, какой часовой пояс вы указали в файле конфигурации. Другими словами, это поведение Rails по умолчанию, которое все ваше время будет сохранено в базе данных в формате UTC.

# Get current time using the time zone of current local system or ENV['TZ'] if the latter is set.
Time.now

# Get current time using the time zone of UTC
Time.now.utc

# Get the unix timestamp of current time => 1524855779
Time.now.to_i

# Convert from unix timestamp back to time form
Time.at(1524855779)

# USE Rails implementation of Time! Notice we say Time.current rather than Time.now. This will allow you to use the timezone defined in Rails configuration and get access to all the timezone goodies provided by ActiveSupport::TimeWithZone.
Time.current

TimeWithZone предоставляет множество очень полезных вспомогательных методов:

# Get the time of n day, week, month, year ago
1.day.ago
1.week.ago
3.months.ago
1.year.ago

# Get the beginning of or end of the day, week, month ...
Time.now.beginning_of_day
30.days.ago.end_of_day
1.week.ago.end_of_month

# Convert time to unix timestamp
1.week.ago.beginning_of_day.to_i

# Convert time instance to date instance
1.month.ago.to_date

В большинстве случаев достаточно времени с классом часового пояса от Rails ActiveSupport. Но иногда вам просто нужно свидание.

Как и в случае с классом Time, Ruby поставляется с классом Date. Просто требуется библиотека времени:

require "time"

Time.parse("Dec 8 2015 10:19")
#=> 2015-12-08 10:19:00 -0200
Date.parse("Dec 8 2015")
#=> #<Date: 2015-12-08>
Time.new(2015, 12, 8, 10, 19)
#=> 2015-12-08 10:19:00 -0200
Date.new(2015, 12, 8)

Поскольку Date является частью Ruby, он по умолчанию использует часовой пояс, определенный в /etc/localtime в Unix-подобных системах, если только вы не изменили переменную окружения TZ. Как и в случае с классом Time, Rails расширяет класс Date. Используйте Date.current вместо Date.today, чтобы использовать ActiveSupport :: TimeWithZone и использовать конфигурации часовых поясов на основе Rails.

Теперь есть еще один класс, доступный в отношении дат и времени. DateTime является подклассом Date и может легко обрабатывать дату, час, минуту, секунду и смещение. Он доступен как в Ruby (через require 'time'), так и в Rails (через require 'date'). Rails расширяет его возможностями TimeZone, как и классом Time.

require 'date'
DateTime.new(2001,2,3,4,5,6) 

Лично я не вижу необходимости использовать DateTime в ваших приложениях, поскольку вы можете использовать само время для представления даты и времени, а вы можете использовать Date для представления даты.

Вторая часть вопроса касалась strptime и strftime. Time, Date и DateTime имеют методы strptime и strftime. strptime анализирует заданное строковое представление и создает объект. Вот пример:

> result = Time.strptime "04/27/2018", "%m/%d/%Y"
 => 2018-04-27 00:00:00 -0400 
> result.class
 => Time 

Это полезно, если у вас есть приложение, а пользователь отправляет форму, и вам дается дата и/или она представлена в виде строки. Вы захотите проанализировать это время или дату, прежде чем сохранить его в базе данных.

strftime форматирует дату или время. Итак, вы вызываете его для объекта Date или Time:

 > Date.current.strftime("%Y-%m-%d")
 => "2018-04-27"

И вы можете использовать их вместе, чтобы сначала проанализировать пользовательский ввод, а затем отформатировать его определенным образом, возможно, для вывода в файл CSV:

 value = Date.strptime(val, '%m/%d/%Y').strftime('%Y-%m-%d')