Java 如何转换日期值;2017年5月26日“;至;2017年5月26日;?
是否有任何java库可用于解析特定于语言的顺序指示符/后缀Java 如何转换日期值;2017年5月26日“;至;2017年5月26日;?,java,date,java-8,date-format,Java,Date,Java 8,Date Format,是否有任何java库可用于解析特定于语言的顺序指示符/后缀 我的日期值如下:2017年5月26日。我想将其转换为2017年5月26日的26。有人能告诉我怎么做吗?假设你在询问Java,这个链接:可以帮助你 总的要点是: import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class TestDateExample3 { public stat
我的日期值如下:
2017年5月26日
。我想将其转换为2017年5月26日的26
。有人能告诉我怎么做吗?假设你在询问Java,这个链接:可以帮助你
总的要点是:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TestDateExample3 {
public static void main(String[] argv) {
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
String dateInString = "26th May 2017"; // Remove your 'th', 'nd', etc. from the input string.
String withoutEnding = dateInString;
//Something like this
if(dateInString.contains("th") withoutEnding = dateInString.replace("th", "");
if(dateInString.contains("nd") withoutEnding = dateInString.replace("nd", "");
if(dateInString.contains("st") withoutEnding = dateInString.replace("st", "");
if(dateInString.contains("rd") withoutEnding = dateInString.replace("rd", "");
try {
Date date = formatter.parse(withoutEnding);
System.out.println(date);
System.out.println(formatter.format(date));
} catch (ParseException e) {
e.printStackTrace();
}
}
}
其中,dd/MM/yyyy
是一个日期格式化程序,它将为您提供
2017年5月26日
希望这有帮助
编辑:另请参见查看
SimpleDataFormat
的不同模式字母的完整列表。您可以使用自定义日期格式将此格式直接解析为Java 8LocalDate
:
static final Map<Long, String> ORDINAL_DAYS = new HashMap<>();
static
{
ORDINAL_DAYS.put(1, "1st");
.... more ....
ORDINAL_DAYS.put(26, "26th");
.... more ....
ORDINAL_DAYS.put(31, "31st");
}
static final DateTimeFormatter FORMAT_DAY_MONTH_YEAR = new DateTimeFormatterBuilder()
.appendText(ChronoField.DAY_OF_MONTH, ORDINAL_DAYS)
.appendLiteral(' ')
.appendText(ChronoField.MONTH_OF_YEAR)
.appendLiteral(' ')
.appendText(ChronoField.YEAR)
.toFormatter();
String dateInString = "26th May 2017";
LocalDate date = LocalDate.parse(dateInString, FORMAT_DAY_MONTH_YEAR);
static final Map ORDINAL_DAYS=new HashMap();
静止的
{
第(1,“第1”)天;
更多
第26、26日;
更多
第31、31日;
}
静态最终日期TimeFormatter格式\日\月\年=新日期TimeFormatterBuilder()
.appendText(ChronoField.DAY/u月,第几天)
.appendLiteral(“”)
.appendText(ChronoField.MONTH\u OF年)
.appendLiteral(“”)
.appendText(年代字段年份)
.toFormatter();
字符串dateInString=“2017年5月26日”;
LocalDate=LocalDate.parse(dateInString,格式为天、月、年);
这使用的是DateTimeFormatter.appendText
版本,它接受用于映射日期字符串的映射
您需要填写我为简洁起见遗漏的
ORDINAL_DAYS
中所有缺失的条目。假设您不需要非常严格的输入验证,因为您正在从数字上带有th
的格式转换(或st
或nd
中的31
,2nd
及更多),我建议你先去掉这两个字母。正则表达式可以这样做:
// remove st, nd, rd or th after day of month
dateInString
= dateInString.replaceFirst("^(\\d+)(st|nd|rd|th)( \\w+ \\d+)$", "$1$3");
String dateOutString = LocalDate.parse(dateInString,
DateTimeFormatter.ofPattern("d MMM uuuu", Locale.ENGLISH))
.format(DateTimeFormatter.ofPattern("dd/MM/uuuu"));
结果是
26/05/2017
如果您的输入包含月份的三个字母缩写,如Apr、May或Jun,则此选项有效。要接受完整的月份名称(April、May、Jun),您需要4毫秒,而不是格式模式中的3毫秒:d MMMM uuu
,如@OleV.V所述。在中,您可以使用带有可选部分的模式(解析不同的后缀st、nd、rd和th)
您还必须使用java.util.Locale
将月份名称强制为英语。代码如下所示:
String input = "26th May 2017";
DateTimeFormatter parser = DateTimeFormatter
// parse the day followed by st, nd, rd or th (using optional patterns delimited by [])
.ofPattern("dd['st']['nd']['rd']['th'] MMM yyyy")
// force English locale to parse month names
.withLocale(Locale.ENGLISH);
// formatter for dd/MM/yyyy output
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy").withLocale(Locale.ENGLISH);
System.out.println(formatter.format(parser.parse(input))); // 26/05/2017
上述代码适用于包含3个字母的月份名称(如May或Aug)。如果要解析全名(如August或March),只需将
MMM
更改为MMMM
:
DateTimeFormatter parser = DateTimeFormatter
// using MMMM to parse full month name (like "August")
.ofPattern("dd['st']['nd']['rd']['th'] MMMM yyyy")
.withLocale(Locale.ENGLISH);
PS:如果要使用相同的
解析器分析两种情况(三个字母或完整的月份名称),可以执行以下操作:
DateTimeFormatter parser = DateTimeFormatter
// can parse "March" or "Mar" (MMMM or MMM)
.ofPattern("dd['st']['nd']['rd']['th'][ MMMM][ MMM] yyyy")
.withLocale(Locale.ENGLISH);
用Java还是Javascript?春天和冬眠有什么关系?关于日期格式转换的许多问题,您做了哪些研究?我想用Java程序将2017年5月26日转换为2017年5月26日。在Java中有更好的方法吗?仅供参考,这里使用的技术术语是搜索st
,th
,rd
,这个主题,和nd
。我想用'th','nd'将日期值解析为标准Java日期格式。@Arvinda抱歉,误读了它!我刚刚更新了答案,以便更好地回答您的实际问题。可能不是最有效的方式(我在工作,所以没有太多的时间),但应该有效@阿文达,你甚至可以留下后缀,但我不确定,我还没有测试过。谢谢@Chris Gilardi,是否有任何java库可用于解析上述日期格式。您将把August
替换为Augu
。当然,除非从一开始就已经是8月了,否则这个问题就不是很清楚了。更宽松,但也更简洁:静态最终日期时间格式\u DAY\u MONTH\u YEAR=DateTimeFormatter.of模式(“d['st']['nd']['rd']['th']MMMM uuuu”,Locale.ENGLISH)代码>。PS考虑指定地点。这是一个很好的答案,我很高兴,如果我贡献了它或启发它的方式或其他。如果是这样的话,一提就好了。无论如何,您的解释可能比我的好,或者至少不同,因此是一个很好的补充。在这两个代码段中,您可以使用两个argDateTimeFormatter.ofPattern()
来获得更简洁的代码。@OleV.V。老实说,在我发布我的答案之后,我看到了你对这个解决方案的评论(我在这里有一个非常类似的代码,带有可选模式等等,我一读到问题,就发布了答案,没有看任何其他内容)。对不起,如果我给人的印象是我抄袭了你的想法,而没有给予任何信任。无论如何,我要编辑答案来添加这些信息。我总是忘记模式的的2-arg版本,我通常不需要设置不同的区域设置。谢谢我相信你。:-)顺便说一句,我建议使用模式()的两个参数
。即使您将Locale.getDefault()
作为第二个参数传递,您也在告诉读者(和您自己!)您已经考虑过该语言环境,并有意识地决定使用哪个语言环境。