检查日期是不是存在(第 30 天/第 31 天)[重复]
Posted
技术标签:
【中文标题】检查日期是不是存在(第 30 天/第 31 天)[重复]【英文标题】:Check whether the Date exists (30th / 31th day) [duplicate]检查日期是否存在(第 30 天/第 31 天)[重复] 【发布时间】:2017-02-09 00:49:49 【问题描述】:如何检查一个月的第 30 天或第 31 天是否存在。
31.09.2016 不存在,但在 Java 和 javascript 中将显示为 01.10.2016。即使使用正确的语言环境等。欢迎使用 javascript 或 java 中的任何解决方案,因为 ajax 请求也可以解决此问题。
提前致谢
【问题讨论】:
把字符串改成日期,再改回字符串。如果字符串相等,则为有效日期;否则,它不是。 我认为可能有更简单的解决方案。这也是我的第一个想法。非常感谢。 @AndyTurner 那么日期 12/31/2016 不存在吗?因为它不会在美国。当然,这是显而易见的,因此它可能会被正确检测到 - 请在 2016 年 5 月 6 日试一试。 @vlaz 好吧,我不知道 - 它 存在吗?取决于您是否要处理不同格式的要求。也就是说,只有 6 种方法可以订购年、月和日 - 您可以随时尝试所有六种排列,看看是否有任何一种是有效的,它仍然比 AJAX 调用快得多。 请注意,在某些年份的某些二月,29 日无效。顺便说一句en.wikipedia.org/wiki/February_30 【参考方案1】:我认为您应该使用 momentjs 库在 javascript 中进行任何类型的日期操作:MomentJS
var date = moment('31.09.2016','DD.MM.YYYY');
console.log(date.isValid()); // This will print false in case of an invalid date
编辑: 创建了一个 plunker,您可以尝试一下:plunker example .检查javascript控制台
【讨论】:
完美。正常工作。非常感谢。验证由 inputmask 完成,但无法检查这种特殊情况。【参考方案2】:@nagyf 的答案对 js 来说非常好,在 java 方面你应该在DateFormat
中将 leninent 属性设置为 false,然后你会得到一个 ParseException 如果日期无效。
示例:
final String d = "31/09/2016";
final DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
df.setLenient(false);
final Date parsDate = df.parse(d);
System.out.println(d);
【讨论】:
不知道这个。谢谢。 :) 不客气!!!!【参考方案3】:这是Java的解决方案
try
String date = "31/9/2016";
Data d = new Date();
DateFormat df = new SimpleDateFormat("đd/MM/yyyy");
df.setLenient(false);
d = df.parse(date);
catch(ParseException ex)
System.out.println("Invalid Date");
【讨论】:
不要捕捉Exception
:尽可能捕捉最具体的异常(即ParseException
),这样你就不会把不相关的问题混为一谈。
@AndyTurner 同意你的看法。我忘了那个例外,谢谢你提醒我:)【参考方案4】:
如果您使用有效日期和给定的 lastDay 来检查给定的 lastDay 与日历上的实际情况,另一种方法是:(不是在 groovy/java 中的 javascript 中)
int day=31
Date givenDate = new Date()
Calendar cal = Calendar.instance
cal.setTime(givenDate)
int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH)
if (day > lastDay)
// fail throw exception
//otherwise good to go
【讨论】:
【参考方案5】:java.time
YearMonth
类很方便。该对象可以提供一个LocalDate
对象,表示该月的最后一天。您可以询问该对象的月份编号。
int numberOfLastDay =
YearMonth.of( 2016 , Month.SEPTEMBER )
.atEndOfMonth()
.getDayOfMonth() ;
【讨论】:
以上是关于检查日期是不是存在(第 30 天/第 31 天)[重复]的主要内容,如果未能解决你的问题,请参考以下文章
mysql 如何把一年中的第几天,比如第300天 ,转换成日期
MySQL活动期间订单满600元并且在活动日期之前超过30天没有下过单_20161030
在文件夹中存在的多个文件中将日期部分动态替换为当前日期 -15 天