转换日期字符串到Java中的特定日期格式“DD-MM-YYYY”(Convert date stri

2019-07-04 05:45发布

我有出生日期的多个联系人和所有与移动设备同步。 现在的问题是所有联系人有不同的生日格式和我想要显示所有的生日日期的像“DD-MM-YYYY”特定的格式。

因此,例如,一个同步的联系人有生日,如“1990年2月7日”或“1988-06-15T22:00:00.000Z”或“1990年12月2日”等等......然后,所有这些日期应该显示以特定的格式 “DD-MM-YYYY”。

那么,如何解决这个问题呢?

任何建议将受到赞赏。

Answer 1:

ISO 8601

现在的问题是所有联系人有不同的生日格式

这是真正的问题:存储各种格式的日期时间值。

当序列化日期时间值的文本, 一定要使用标准的ISO 8601种格式 。 这些格式是理智和现实,避免歧义,易于通过机器可读跨文化解析以及人类。

所述java.time类解析/生成字符串时默认使用这些标准格式。

java.time

现代的方法是利用取代了麻烦的旧的遗留日期时间类java.time类。 避免遗留DateCalendarSimpleDateFormat ,和相关的类。

因此,例如,一个同步的联系人有生日,如“1990年2月7日”或“1988-06-15T22:00:00.000Z”或“1990年12月2日”等...

解析任何可以想象日期时间格式,因为不确定性是不可能的。 例如,为01-02-1990代表1月2日或2月1日?

如果你愿意,你可以猜测 ,虽然这可能取决于精度多么的重要手段,你的业务问题是不明智的。

定义了一堆用格式化模式DateTimeFormatter 。 尝试每。 当DateTimeParseException被抛出,转移到下一个模式,直到一个工作。

您可以使用字符串长度 ,以帮助指导猜测。

List < DateTimeFormatter > dateFormatters = new ArrayList <>( 2 );
dateFormatters.add( DateTimeFormatter.ofPattern( "uuuu-MM-dd" ) );  // BEWARE of ambiguity in these formatters regarding month-versus-day.
dateFormatters.add( DateTimeFormatter.ofPattern( "dd-MM-uuuu" ) );

String input = "1990-02-07";
// String input = "12-02-1990" ;

if ( null == input )
{
    throw new IllegalArgumentException( "Passed null argument where a date-time string is expected. Message # c7a4fe0e-9500-45d5-a041-74d457381008." );
} else if ( input.length() <= 10 )
{
    LocalDate ld = null;
    for ( DateTimeFormatter f : dateFormatters )
    {
        try
        {
            ld = LocalDate.parse( input , f );
            System.out.println( ld );
        } catch ( Exception e )
        {
            // No code here.
            // We purposely ignore this exception, moving on to try the next formatter in our list.
        }
    }
} else if ( ( input.length() > 10 ) && input.substring( input.length() - 1 ).equalsIgnoreCase( "Z" ) ) // If over 10 in length AND ends in a Z.
{
    Instant ld = null;
    try
    {
        ld = Instant.parse( input );  // Uses `DateTimeFormatter.ISO_INSTANT` formatter.
    } catch ( Exception e )
    {
        throw new IllegalArgumentException( "Unable to parse date-time string argument. Message # 0d10425f-42f3-4e58-9baa-84ff949e9574." );
    }
} else if ( input.length() > 10 )
{
    // TODO: Define another list of formatters to try here.
} else if ( input.length() == 0 )
{
    throw new IllegalArgumentException( "Passed empty string where a date-time string is expected. Message # 0ffbd9b6-8905-4e28-a732-0f402d4673df." );
} else  // Impossible-to-reach, for defensive programming.
{
    throw new RuntimeException( "ERROR - Unexpectedly reached IF-ELSE when checking input argument. Message # 6228d9e0-047a-4b83-8916-bc526e0fd22d." );
}
System.out.println("Done running.");

1990年2月7日

完成运行。


关于java.time

java.time框架是建立在Java 8和更高版本。 这些类取代麻烦的老传统日期时间类,如java.util.DateCalendar ,和SimpleDateFormat

乔达-时间的项目,现在在维护模式 ,建议迁移到java.time类。

要了解更多信息,请参阅甲骨文教程 。 和搜索堆栈溢出了很多例子和解释。 规范是JSR 310 。

您可以直接与数据库交换java.time对象。 使用JDBC驱动程序与兼容JDBC 4.2或更高版本。 无需串,没有必要java.sql.*类。

从哪里获取java.time类?

  • 的Java SE 8Java SE的9 ,后来
    • 内置。
    • 具有捆绑实现标准Java API的一部分。
    • Java的9增加了一些小的功能和修复。
  • Java SE 6中Java SE 7中
    • 多的java.time功能后移植到Java 6和7在ThreeTen-反向移植
  • Android的
    • 后来版本的java.time类的Android束实现的。
    • 对于较早的Android(<26),则ThreeTenABP项目适应ThreeTen-反向移植 (上面提到的)。 请参阅如何使用ThreeTenABP ...

ThreeTen-额外项目与其他类扩展java.time。 该项目是为将来可能增加的java.time试验场。 您可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter ,和更多 。



Answer 2:

只需用的SimpleDateFormat类。 就像是:

Date d = Calendar.getInstance().getTime(); // Current time
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); // Set your date format
String currentData = sdf.format(d); // Get Date String according to date format

在这里你可以查看详细信息和所有支持格式:

http://developer.android.com/reference/java/text/SimpleDateFormat.html



Answer 3:

不知何故,我明白你的问题就在这里。 您可以尝试很长的路要走像分割字符串“ - ”,并将其存储在阵列然后检查每个字符串数组中,解析它为int然后执行条件语句。

假设你给的那些具有以下格式“1990年2月7日”年 - 月 - 日“1988-06-15T22:00:00.000Z”年 - 月 - dayTtimeZ“1990年12月2日”月 - 日 - 年

你可以尝试这样的事情。

    public String convert(String s){
        SimpleDateFormat newformat = new SimpleDateFormat("dd-MM-yyyy");
        try{
            if(s.contains("T")){
                String datestring = s.split("T")[0];
                SimpleDateFormat oldformat = new SimpleDateFormat("yyyy-MM-dd");
                String reformattedStr = newformat.format(oldformat.parse(datestring));
                return reformattedStr;
            }
            else{
                if(Integer.parseInt(s.split("-")[0])>13){
                    SimpleDateFormat oldformat = new SimpleDateFormat("yyyy-MM-dd");
                    String reformattedStr = newformat.format(oldformat.parse(s));
                    return reformattedStr;
                }
                else{
                    SimpleDateFormat oldformat = new SimpleDateFormat("MM-dd-yyyy");
                    String reformattedStr = newformat.format(oldformat.parse(s));
                    return reformattedStr;
                }

            }
        }
        catch (Exception e){
            return null;
        }
    }


文章来源: Convert date string to a particular date format “dd-MM-yyyy” in Java