普通Ruby:只为DateTime实例设置时区

普通Ruby:只为DateTime实例设置时区,ruby,datetime,timezone,Ruby,Datetime,Timezone,所有现有答案都使用lib或Rails。我需要用纯红宝石做这个。我还发现很难想象像Ruby这样漂亮的语言会让这变得如此困难 我有许多这样的日期字符串:07 11月20日。我可以使用以下方法将它们解析为DateTime实例: >需要“时间” =>正确 >DateTime.strTime(“20年11月7日,“%d%b%y”) => # >新的偏移量(“+05:30”) => # 我们可以看到,使用DateTime#new_offset不仅可以更改偏移量,还可以更改时间。似乎不存在任何其他方法仅更改

所有现有答案都使用lib或Rails。我需要用纯红宝石做这个。我还发现很难想象像Ruby这样漂亮的语言会让这变得如此困难

我有许多这样的日期字符串:
07 11月20日
。我可以使用以下方法将它们解析为
DateTime
实例:

>需要“时间”
=>正确
>DateTime.strTime(“20年11月7日,“%d%b%y”)
=> #
>新的偏移量(“+05:30”)
=> #
我们可以看到,使用
DateTime#new_offset
不仅可以更改偏移量,还可以更改时间。似乎不存在任何其他方法仅更改时区和/或偏移量

如果可能的话,我也希望对单个
DateTime
实例执行此操作,而不是对将来通过一些
TIMEZONE
全局或其他方式创建的所有
DateTime
实例执行此操作

注意:虽然输入字符串不包含任何时间组件,但我仍然需要我的运行时表示才能有一个时间组件。因此,虽然使用像
Date#strtime
这样的简单方法可行,但它并不“理想”

注2:我猜简单地“设置”时区还存在其他复杂问题,这就是为什么不存在此功能的原因。例如,当您“设置”时区时,如何处理DST并不明显。我猜想,如果要确保传入有效的偏移量将始终返回有效的
DateTime
实例,那么更改时间将是不可避免的


编辑1
进一步挖掘date(
date/date\u core.c
)的源代码,可以发现
set\u of
函数用于设置
DateTime
实例的偏移量。不幸的是,这种逻辑似乎与时间的操纵有关。这解释了为什么Ruby stdlib中没有只设置偏移量的方法。

它们应该是
Date
对象吗?日期既没有时间也没有时区

Date.strptime("07 Nov 20", "%d %b %y")
否则,您可以向字符串添加时区并对其进行解析

string = "07 Nov 20"
p DateTime.strptime("#{string}+0530", "%d %b %y %z")
或者你可以减去额外的时间<代码>日期时间减去天数,取小数

DateTime.strptime("07 Nov 20", "%d %b %y").new_offset("+05:30") - 5.5/24

它们是约会,应该有时间还是时区?你应该改用吗?好的。我认为这是解决问题的一种方法facepalm:@Shwern,我还有一些其他用例,其中字符串实际上是日期和时间实例。目前。我已经在做你提到的弦-康卡特的事情了。@SatyajeetKanetkar它能工作。你也可以在转换时区后减去5.5小时<代码>dt-5.5/24。