Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何转换日期值;2017年5月26日“;至;2017年5月26日;?_Java_Date_Java 8_Date Format - Fatal编程技术网

Java 如何转换日期值;2017年5月26日“;至;2017年5月26日;?

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

是否有任何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 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 8
LocalDate

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所述。在中,您可以使用带有可选部分的模式(解析不同的后缀stndrdth

您还必须使用
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个字母的月份名称(如MayAug)。如果要解析全名(如AugustMarch),只需将
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考虑指定地点。这是一个很好的答案,我很高兴,如果我贡献了它或启发它的方式或其他。如果是这样的话,一提就好了。无论如何,您的解释可能比我的好,或者至少不同,因此是一个很好的补充。在这两个代码段中,您可以使用两个arg
DateTimeFormatter.ofPattern()
来获得更简洁的代码。@OleV.V。老实说,在我发布我的答案之后,我看到了你对这个解决方案的评论(我在这里有一个非常类似的代码,带有可选模式等等,我一读到问题,就发布了答案,没有看任何其他内容)。对不起,如果我给人的印象是我抄袭了你的想法,而没有给予任何信任。无论如何,我要编辑答案来添加这些信息。我总是忘记模式的
的2-arg版本,我通常不需要设置不同的区域设置。谢谢我相信你。:-)顺便说一句,我建议使用模式()的两个参数
。即使您将
Locale.getDefault()
作为第二个参数传递,您也在告诉读者(和您自己!)您已经考虑过该语言环境,并有意识地决定使用哪个语言环境。