正如本答案中所述,当日期模式(这里是ddMMyy)已知时,构建DateTimeFormatter
很容易。
但是由于用户输入模式,我不知道如何正确构建DateTimeFormatterBuilder
。我不能硬编码。
我必须自己解析模式并按正确的顺序调用appendpattern()
和appendvaluereduced()
吗?还是有一个内置的解决方案?
这里是java-8-解决方案(它看起来很像一个黑客):
String pattern = "MM/dd/yy 'US'"; // user-input
String text = "10/04/69 US"; // user-input
Locale locale = Locale.US; // user-input, too?
int yy = pattern.indexOf("yy");
DateTimeFormatter dtf;
if (
(yy != -1) // explanation: condition ensures exactly two letters y
&& ((yy + 2 >= pattern.length()) || pattern.charAt(yy + 2) != 'y')
) {
DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
String part1 = pattern.substring(0, yy);
if (!part1.isEmpty()) {
builder.appendPattern(part1);
}
builder.appendValueReduced(ChronoField.YEAR, 2, 2, 1970);
String part2 = pattern.substring(yy + 2);
if (!part2.isEmpty()) {
builder.appendPattern(part2);
}
dtf = builder.toFormatter(locale);
} else {
dtf = DateTimeFormatter.ofPattern(pattern, locale);
}
LocalDate ld = LocalDate.parse(text, dtf);
System.out.println("user-date: " + ld); // 2069-10-04
只有一个小小的警告:如果任何用户得到疯狂的想法,在模式中分别定义两次“YY”,那么建议的解决方案将失败。正确的解决方案需要在模式字符上进行某种迭代,但我认为这是矫枉过正,所以我把它留在这里。
为了进行比较,使用我的外部库Time4J可以实现以下简短的解决方案,因为它的解析引擎也有设置任何合适格式属性的概念:
LocalDate ld =
ChronoFormatter.ofDatePattern(pattern, PatternType.CLDR, locale)
.with(Attributes.PIVOT_YEAR, 2070).parse(text).toTemporalAccessor();
问题内容: 用户将以不同的模式向我的应用程序输入日期。对于两位数的年份,他还必须确定关键日期。 示例: pattern = yy-MM-dd 枢轴日期= 70 (我以编程方式添加了当前的千年和上个世纪,以获得更多动态=> 1970 ) 69-04-22 变为 2069-04-22 70-04-22 变为 1970-04-22 像此答案中所述,很容易在已知日期模式(此处为 ddMMyy )时构建一个
我正在处理卡的到期日期。我有一个API,我将在其中获得“yyMM”格式的到期日期为“String”。在这里,我正在尝试使用 带有TimeZone.getTimeZone("UTC ")的SimpleDateFormat 所以我的代码就像 现在的问题是,当我通过 2011 年时,它给出的是 这里你可以看到我把11作为月份,但是它把它转换成10月而不是11月。 为什么? 还有哪些其他选项可以将带有 的
Excel单元格的日期格式为,显示日期为4位年份。然而,POI以另一种格式返回日期。单元格样式返回相同的格式,带有2位year。 有没有可能用POI获得与我在Excel中看到的格式相同的格式?
问题内容: 我正在尝试将包含2007年12月1日等各个部分的日期转换为SQL Server 2005中的日期时间。我尝试了以下方法: 但这会导致日期错误。将三个日期值转换为正确的日期时间格式的正确方法是什么? 问题答案: 假设全部,如何:
问题内容: 我从网络上获取了日期字符串,然后我想将其切成对象。但是应用程序以某种方式崩溃。这是我正在解析的字符串: onStartCommand() stringToDate() LogCat: 编辑: onDestroy()为定期更新设置警报… 问题答案: 从中删除“ XXX” 一切都会正常。 浏览可在构造函数内使用的符号列表。尽管文档显示的是“ XXX”格式,但这在Android上不起作用,并
问题内容: 根据doc,日历set()为: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Calendar.html#set%28int,%20int,%20int%29 码: 输出: 为什么不是1月30日??? 问题答案: 1月是2月。2月30日更改为3月1日。您应该将月份设置为0。最好是使用Calendar中定义的常量: