如何解决`DateTime.parse" 2月的崩溃问题。 29"`?

时间:2015-09-04 01:27:24

标签: ruby datetime

我解析文本日期,并将返回DateTime,如下所示:

DateTime.parse "Feb. 28"
# => Sat, 28 Feb 2015 00:00:00 +0000

但是,解析"Feb. 29"会导致无效的日期崩溃。如何解决此崩溃以解释此闰年日期?

3 个答案:

答案 0 :(得分:1)

您可以使用enter image description here方法确定年份是否为闰年:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{minted} % don't need to import `listing` or `listings`

% custom labels, according to the docs 
\renewcommand\listingscaption{Code}
\renewcommand\listoflistingscaption{List of code snippets}

\title{Code Listing}
\begin{document}
\maketitle
\section{Code examples}

\begin{listing}[H] % creates a float
\begin{minted} % does the syntax highlighting
[
frame=lines,
framesep=2mm,
baselinestretch=1.2,
fontsize=\footnotesize,
linenos
]
{python}
your_code(...)
\end{minted}
\caption{Example of code}
\label{lst:code1}
\end{listing}

This is a reference to Code~\ref{lst:code1} to make it appear in the list of listings.

\clearpage

\listoflistings % NOT `lstlistoflistings`

\end{document}

因此,如果是闰年,您可以将年份与日期Date.leap? 2016 # => true Date.leap? 2015 # => false 一起传递。这样,你的程序就不会崩溃。

或者,你可以随时使用日期和年份来避免这种情况。即DateTime.parse "Feb. 29 2016"DateTime.parse "Feb. 28 2013"等。如果您以此格式传递日期,则无需明确检查闰年。

答案 1 :(得分:1)

CAN 捕获解析无效日期时引发的异常..

begin
  d = DateTime.parse("Feb. 29")
rescue ArgumentError  
  d = "Invalid Date"
end

但它可能并不理想,而且实际上只取决于您对数据的处理方式以及最佳的处理方式。如果您正在寻找完整的日期对象,那么最好做一些事情,例如检查给定日期时间对象的闰年并从那里开始。

答案 2 :(得分:0)

DateTime对象(或普通意义上的日期)不能仅按月和日定义;它需要一年。您可能已经注意到通过解析"Feb. 28",省略年份表示该字符串将被解析为当前年份。字符串"Feb. 29"未被无条件拒绝,但在此时被拒绝,因为今年(2015年)不是闰年,因此"Feb. 29"无效。

所以解决方法是,无论何时解析要评估为当前年份的字符串,它都能正常工作;如果当前年份不是闰年,"Feb. 29"将被正确拒绝。否则,您需要提供明确的年份。

K M Rakibul Islam的回答是在正确的轨道上提及应该提供明确的年份,但是关于何时这样做的答案是错误的。