在Java中将日期格式从MM/DD/YYYY转换为DD-MMM-YYYY

12

在Java中,有一种方法可以将MM/DD/YYYY转换为DD-MMM-YYYY吗?

例如:05/01/1999 转换为 01-MAY-99


2
请注意,您的模式语法实际上是无效的。年份使用 y,月份中的日期使用 dY 没有意义, D 表示一年中的天数。您要将格式从 MM/dd/yyyy 转换为 dd-MMM-yyyy - BalusC
你应该在选项中使用Locale.English: https://dev59.com/4U3Sa4cB1Zd3GeqPsBAJ#2603676 - Phuong
8个回答

28

使用SimpleDateFormat解析日期,然后使用所需格式的SimpleDateFormat将其打印出来。

以下是一些代码:

    SimpleDateFormat format1 = new SimpleDateFormat("MM/dd/yyyy");
    SimpleDateFormat format2 = new SimpleDateFormat("dd-MMM-yy");
    Date date = format1.parse("05/01/1999");
    System.out.println(format2.format(date));

输出:

01-May-99

2
你可能想要在SDF构造函数中提供一个“Locale”,否则它将只采用平台默认的月份名称区域设置,这可能不是你想要使用的区域设置。 - BalusC
非常正确,您也可以使用format1.setTimeZone(TimeZone.getTimeZone("GMT"));来设置时区。 - Brian Clements
2
对于后来阅读此问题的读者:SimpleDateFormat类已经过时且出了名的麻烦。不要使用它。自2014年以来,我们在java.time,现代Java日期和时间API及其DateTimeFormatter中有更好的选择。请参见Md. Asaduzzaman的正确答案 - Ole V.V.

3

java.time

在Java 8及以后的版本中,应该使用java.time类。要使用java.time,请添加:

import java.time.* ;

下面是一个示例,展示您如何格式化日期。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MMM-yyyy");
String date = "15-Oct-2018";
LocalDate localDate = LocalDate.parse(date, formatter);

System.out.println(localDate); 
System.out.println(formatter.format(localDate));

@Billal,如果你在代码块中添加import java.time.*;,那么你也应该添加类名定义。我只是想澄清开发人员我正在使用哪个包。 - Md. Asaduzzaman
是的,非常正确,我实际上忘记回滚我的编辑了,抱歉,谢谢。 - Billal Begueradj
我建议始终明确指定所需的“Locale”以便翻译月份的名称。在这里我们可以使用一些与英语相关的东西,比如Locale.CANADALocale.USLocale.UK。将其作为可选的第二个参数传递给ofPattern方法。运行时当前默认区域设置可能不是英语,此时该代码将失败并引发异常。 - Basil Bourque
2
对于Java 6&7,大多数java.time功能都在ThreeTen-Backport项目中可用。因此,不需要再使用可怕的Date / Calendar /SimpleDateFormat类。 - Basil Bourque

2

试一下这个:

Date currDate = new Date();
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
String strCurrDate = dateFormat.format(currDate);
System.out.println("strCurrDate->"+strCurrDate);

1
FYI,诸如java.util.Datejava.util.Calendarjava.text.SimpleDateFormat等非常麻烦的旧日期时间类现在被视为遗留系统,已被内置于Java 8及更高版本的java.time类所取代。请参阅Oracle的教程 - Basil Bourque

2
final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
LocalDate localDate = LocalDate.now();
System.out.println("Formatted Date: " + formatter.format(localDate));

Java 8 LocalDate


1

java.time

java.util日期时间API及其格式化API SimpleDateFormat已过时且容易出错。建议完全停止使用它们并切换到现代日期时间API*

日期时间解析/格式化类型是Locale敏感的

日期时间解析/格式化类型(例如DateTimeFormatter)是Locale敏感的,即相同的字母会在不同的Locale中产生不同的文本。例如,MMM用于月份名称的三个字母缩写,在不同的Locale中可能是不同的单词。在缺少Locale参数的情况下,它将使用JVM的Locale。因此,永远不要忘记在没有Locale参数的情况下使用日期时间解析/格式化类型。从不要在没有Locale的情况下使用SimpleDateFormat或DateTimeFormatter了解更多信息。
你需要两个DateTimeFormatter实例 - 一个用于解析输入字符串,另一个用于根据要求的模式格式化输出字符串。

演示:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter dtfInput = DateTimeFormatter.ofPattern("MM/dd/uuuu", Locale.ENGLISH);
        String strDate = "05/01/1999";
        LocalDate date = LocalDate.parse(strDate, dtfInput);

        // The default string i.e. the value returned by LocalDate#toString
        System.out.println(date);

        DateTimeFormatter dtfOutputEng = DateTimeFormatter.ofPattern("dd-MMM-uuuu", Locale.ENGLISH);
        String formattedEng = dtfOutputEng.format(date);
        System.out.println(formattedEng);

        DateTimeFormatter dtfOutputFr = DateTimeFormatter.ofPattern("dd-MMM-uuuu", Locale.FRENCH);
        String formattedFr = dtfOutputFr.format(date);
        System.out.println(formattedFr);
    }
}

输出:

1999-05-01
01-May-1999
01-mai-1999

在线演示

其他重要说明:

  1. 在使用格式化字符串时,应该使用 y(年份)代替 Y (基于周的年份),d(月份中的天数)代替 D(一年中的天数)。请查看文档以了解更多信息。
  2. 在这里,您可以使用 y 代替 u,但是我更喜欢使用 u 而不是 y

Trail: Date Time了解有关现代日期时间 API*的更多信息。


* 如果由于任何原因,您必须坚持使用Java 6或Java 7,则可以使用ThreeTen-Backport,它将大部分java.time功能移植到Java 6和7。如果您正在为Android项目工作,并且您的Android API级别仍不符合Java-8,请查看通过desugaring可用的Java 8+ API如何在Android项目中使用ThreeTenABP


1

试试这个

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); // Set your date format
String currentData = sdf.format(new Date());

0

下面应该可以工作。

SimpleDateFormat df = new SimpleDateFormat("dd-MMM-yyyy");
Date oldDate = df.parse(df.format(date)); //this date is your old date object

-1
formatter = new SimpleDateFormat("dd-MMM-yy");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接