Ruby에서 DateTime의 시간 부분 설정


104

예를 들어 datetime 객체가 있다고 가정합니다 DateTime.now. 시간과 분을 0 (자정)으로 설정하고 싶습니다. 어떻게 할 수 있습니까?

답변:


220

Rails 환경에서 :

ActiveSupport 덕분에 다음을 사용할 수 있습니다.

DateTime.now.midnight
DateTime.now.beginning_of_day

또는

DateTime.now.change({ hour: 0, min: 0, sec: 0 })

# More concisely
DateTime.now.change({ hour: 0 })                

순전히 Ruby 환경에서 :

now = DateTime.now
DateTime.new(now.year, now.month, now.day, 0, 0, 0, now.zone)

또는

now = DateTime.now
DateTime.parse(now.strftime("%Y-%m-%dT00:00:00%z"))

26
FWIW, 변경 방법은 루비가 아닌 레일의 일부입니다. 시간 옵션 (시, 분, 초)은 계단식으로 재설정되므로 시간 만 지나면 분과 초는 0으로 설정됩니다. 시간과 분이 지나면 초는 0으로 설정됩니다.
Anna

1
DateTime.now.midnight는 예상대로 24:00:00을 반환하지 않고, 시작 _of_day와 동일한 값인 00:00:00을 반환합니다. 일부 시나리오에서 이것이 왜 중요 할 수 있는지에 대한 내 대답을 참조하십시오.
rmcsharry 2011

1
첫 번째 순수 루비 솔루션 시간대 정보 방울, 두 번째는하지 않습니다
토니

1
시간대를 고려하여 답변을 업데이트하고 두 번째 변형을 대체했습니다. @Tony는 매우 잘 잡았습니다. 실제로 둘 다 자세히 살펴보면 시간대 정보가 손실되기 쉽습니다. DateTime.new(now.year, now.month, now.day, 0,0,0, now.zone) != now.to_date.to_datetime
ashoda

TIMEZONE : 인수 해시에서 키워드 오프셋으로 변경할 수 있습니다. DateTime.now.change ({시간 : 0, 최소 : 0, 초 : 0 오프셋 : '+02 : 00'})
Ekkstein

34

신경 쓰지 마. 새 DateTime을 만들어야합니다.

DateTime.new(now.year, now.month, now.day, 0, 0, 0, 0)

6
좋은 대답입니다. 이 0이 HOUR, MINUTE, SECOND 및 OFFSET (시간대) 순서를 나타냄을 추가하고 싶었습니다.
d_ethier jul.

3
이 작업을 수행하지 못한 후 나는 다음과 같이 배웠습니다 DateTime.new(Time.now.year, Time.now.month, Time.now.day, 0, 0, 0).
Ekkstein 2014

2
잊지 마세요 : now = DateTime.now
Abel

1
( "- 0700") MST 아닌 정수 또한 참고로 마지막 인수는 시간대 등의 문자열이 될 필요가 있음
Donavan 화이트

2
역사적인 날짜를 다루지 않는 한을 사용하지 마십시오 DateTime. 영국과 같이 일광 절약 시간제를 사용하는 국가에 거주하면 성가신 문제가 발생합니다. 여기에서 설명을 참조하십시오. gist.github.com/pixeltrix/e2298822dd89d854444b
fatuhoku

5

경고 : DateTime.now.midnightDateTime.now.beginning_of_day(현재 날짜의 제로 시간 - 당신은 그 이름에서 기대하는 것처럼 자정 24:00:00 반환하지 않습니다) 같은 값을 반환합니다.

그래서 나는 미래의 자정 x 일을 계산하기 위해 받아 들여지는 대답을 사용할 수있는 사람을 위해 이것을 추가 정보로 추가하고 있습니다.

예를 들어 14 일 자정에 만료되는 14 일 무료 평가판은 다음과 같습니다.

DateTime.now.midnight + 14.days

13.x 일 평가판에 해당하는 14 일의 아침입니다 (x는 남은 하루의 일부입니다. 지금 정오이면 13.5 일 평가판입니다).

실제로 다음을 수행해야합니다.

DateTime.now.midnight + 15.days

14 일 자정에 도착합니다.

이런 이유로 저는 beginning_of_day00:00:00이므로 항상 사용하는 것을 선호합니다 . 자정을 사용하면 오해의 소지가 있거나 오해를받을 수 있습니다.


1

자주 사용하는 경우이 gem을 설치하여 날짜 구문 분석을 개선하는 것이 좋습니다.

https://github.com/mojombo/chronic

require 'chronic'

Chronic.parse('this 0:00')

이 답변이 옳다고 표시된 이유를 잘 모르겠습니다. 실제로 질문에 대한 답이 아닙니다. 문자열을 날짜로 구문 분석하는 방법을 알고 있습니다. 그러나 주어진 날짜 인스턴스의 특정 부분을 변경하는 방법을 알고 싶습니다. 예를 들어 연도. 어떤 아이디어? Java에서는 연도에 대해 setter를 사용합니다. 그러나 :-( 루비에서 작동하지 않습니다
로버트 REIZ

1
나는 더 이상 만성 보석을 신뢰하지 않습니다. 정말 구식입니다. 내 앱에서 런타임에 날짜-시간을 구문 분석하는 데 문제가있어 비즈니스 손실이 발생했습니다.
비제이 미나
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.