将Ruby字符串转换为日期时间格式

3

我可以为您进行翻译。以下是需要翻译的it技术相关内容:

我从用户输入中得到了多个日期,例如:

MM-DD-YYYY

6-3-1975

MM/DD/YYYY

4/23/1967

使用内置的Ruby require 'time'

尝试使用Time.parse("4/23/1967")时,出现错误信息:time.rb : argument out of range

有没有解决方案可以将用户输入的不同格式(带破折号或斜杠)转换为可解析的格式?


那么你想要的输入格式是什么? - jkeuhlen
用户可以输入所示的输入... 问题是我正在尝试将不同格式转换为一个格式... MM/DD/YYYY。 - AntonB
所以你只是想强制所有用户输入最终呈现为 MM/DD/YYYY 格式吗?我有点困惑你在尝试使用 Time.parse 实现什么。 - jkeuhlen
对于 Java,搜索“java date”可以找到数百个问题和答案,包括讨论和示例代码,用于将字符串解析为日期时间对象。提示:避免使用 java.util.Date 和 .Calendar 以及 SimpleDateFormat,可以看看 Joda-Time 和 java.time。 - Basil Bourque
问题在于,您不知道用户所在的语言环境,这会告诉您他们首选的日期格式。您假设他们是以美国为中心的,这是一个错误的假设。询问您的用户,以便您知道,然后使用 strptime 解析为正确的格式或一种形式,不允许他们输入月份和日期值,而是使用弹出窗口或选择框。 - the Tin Man
显示剩余2条评论
3个回答

3

解决方案:

require 'date'

userDate = "4-23-1967"
readDate = Date.strptime(userDate, "%m-%d-%Y")
convertedDate = readDate.strftime("%-m/%-d/%Y")
puts convertedDate

OUTPUT: 4/23/1967

1

请尝试以下代码:

Time.parse("23/4/1967")
#=> 1967-04-23 00:00:00 +0100
Time.parse("3-6-1975")
#=> 1975-06-03 00:00:00 +0100

所以问题在于你的月份和日期顺序被颠倒了。

这不是我的问题...用户输入的是MM/DD/YYYY格式,所以我必须将其转换为正确的格式,但仍然无法正常工作。 - AntonB
也许你可以尝试这个一行代码:Time.parse(date.match(/^(\d+)[^\d](\d+)/).captures.reverse.push(date.match(/[^\d](\d{4})$/)[1]).join('-')) - Jing Li
1
@AntonB,“我必须将其转换为正确的格式”。如果一个用户在美国并使用“MM/DD/YYYY”,而另一个用户在世界其他地方使用“DD/MM/YYYY”,会发生什么?你会随意交换MM值和DD吗?你不能这样做,因为有时日期会失败,有时月份和日期值会被颠倒。这时你就会引入一个非常烦人的错误。你必须询问用户他们想要使用哪种日期格式,或者使用一种表单,不允许他们在输入月份和日期时颠倒它们。 - the Tin Man

-1

看起来你应该使用gsub函数,将你不想要的字符替换为你需要的字符。

input = "6-3-1975"
sanitized_input = input.gsub(/[- ]/, '/')

在方括号内,您可以放置任何您的用户包含但您不想要的分隔符。


这并不能解决问题,只是把它推迟了。 - the Tin Man
你是什么意思? - jkeuhlen
@theTinMan,你能详细说明一下吗? - jkeuhlen
6/3/1975 是一种格式,Ruby 将错误解释为天数是 "6" 月份是 "3" ,除非进行更多的工作来强制 Ruby 正确解析该字符串。因此,你的答案只会推迟由于像 1/13/1975 这样的值而导致的被拒绝的字符串的问题,结果是 parse 始终无法理解的日期。 - the Tin Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接