当前位置: 首页 > 知识库问答 >
问题:

用序数转换日期(11,22等)

宁良平
2023-03-14
String value = "September 22nd 2015, 10:39:42 am";
String format = "dd/MM/yyyy HH:mm:ss"; 
SimpleDateFormat sdf = new SimpleDateFormat(format); 
try { 
  Date date = sdf.parse(value); 
  System.out.println(date); 
  System.out.println(sdf.format(date)); 
}
catch (ParseException ex) {
   ex.printStackTrace(); 
}

共有1个答案

柳景胜
2023-03-14

该格式的棘手之处在于处理序数(如22),即处理右后缀。没有内置模式。为此,我们必须在DateTimeFormatterBuilder的帮助下构建自己的DateTimeFormatter

DateTimeFormatterBuilder有一个方法AppendText(field,textLookup),其目标是在给定映射中查找已读文本,并用与该值关联的键替换它。这意味着我们需要建立一个地图所有可能的天(1到31)与他们相应的后缀。

我从这个答案中取了转换代码。

private static final Map<Long, String> DAYS_LOOKUP =
        IntStream.rangeClosed(1, 31).boxed().collect(toMap(Long::valueOf, i -> getOrdinal(i)));

public static void main(String[] args) throws Exception {
    DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern("MMMM")
                                .appendLiteral(" ")
                                .appendText(ChronoField.DAY_OF_MONTH, DAYS_LOOKUP)
                                .appendLiteral(" ")
                                .appendPattern("yyyy")
                                .appendLiteral(", ")
                                .appendPattern("hh")
                                .appendLiteral(":")
                                .appendPattern("mm")
                                .appendLiteral(":")
                                .appendPattern("ss")
                                .appendLiteral(" ")
                                .parseCaseInsensitive()
                                .appendPattern("a")
                                .toFormatter(Locale.ENGLISH);
    LocalDateTime dateTime = formatter.parse("September 22nd 2015, 10:39:42 am", LocalDateTime::from);
    String text = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss").format(dateTime);
    System.out.println(text);
}

private static String getOrdinal(int n) {
    if (n >= 11 && n <= 13) {
        return n + "th";
    }
    switch (n % 10) {
        case 1:  return n + "st";
        case 2:  return n + "nd";
        case 3:  return n + "rd";
        default: return n + "th";
    }
}
 类似资料:
  • 周日->明谷-0 周一->赛宁-1 周二->Selasa-2 帮我谢谢

  • 问题内容: 我正在以编程方式从ldap导出用户。因此,我正在从ldap检索用户。属性之一是。 我必须转换的值之一是:直接将其拆分成以下格式:+ 。问题在于应用程序正在CET时区运行,并且存储的时间是UTC,这可能由表示。是,并且本地表示形式是。夏季似乎是2个小时,而冬季是1个小时。 我检查了SimpleDateFormat,发现时区有一个占位符,但是它是不同的格式。 由于忽略日期时区,将显示错误的

  • 问题内容: 我在具有Excel Date序列号Date的csv文件中得到了名为DateOfBirth的列 例子: 当我在excel中格式化单元格时,这些将转换为 我需要在SSIS或SQL中进行此转换。如何做到这一点? 问题答案: 在SQL中:

  • 问题内容: 我正在尝试将AEDT日期转换为dd / MM / yyyy HH:mm:ss z,但它给了我异常: 线程“主”中的异常java.text.ParseException:无法解析的日期:java.text.DateFormat.parse(DateFormat.java:337)的“ 2014年3月3日16:56:46 AEDT” 请在这件事上给予我帮助.... 我需要将用户时间转换为我

  • 问题内容: 我的json 响应 包含一个 CreatedOn 日期: 我需要将 CreatedOn 转换为简单的日期格式,并 计算从CreatedOn日期到当前日期的差异天数。 当我调试下面的代码字符串 CreatedOn时 显示一个空值。怎么会? 问题答案: 要么 考虑使用JSON方法而不是包含。JSON具有“ has()”,用于验证密钥是否存在。 您还应该确保首先尝试{}捕获{}字符串,以确保

  • 我们正在使用Spring Data JPA访问Derby-DB。时态值定义为java.time.LocalDate(java 8 time api)。Spring Data现在随Jsr310Convertersorg.springframework.data.convert.。将LocalDate转换为java.util.Date,因为据我所知,JPA规范到目前为止不支持LocalDate。 我们