如何在Android中格式化日期和时间?

377

如何根据设备配置的日期和时间正确格式化具有年、月、日、小时和分钟的时间?

26个回答

316

使用标准的Java DateFormat类。

例如,要显示当前日期和时间,请按照以下步骤操作:

Date date = new Date(location.getTime());
DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());
mTimeText.setText("Time: " + dateFormat.format(date));

你可以使用自己的值来初始化一个Date对象,但是你应该知道构造函数已经被弃用了,你真正应该使用Java Calendar对象。


43
这里使用的是android.text.format.DateFormat而非java.text.DateFormat。 - jamesh
4
Android输入法通常会有两个类声称可以提供默认语言环境的结果,但其实只有其中一个是正确的。因此,请务必使用android.text.format版本的DateFormat(甚至不派生自java.util版本的) 。 - mxcl
23
请注意这行代码:DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext()); 返回的 dateFormat 是类型为 java.text.DateFormat(而不是 `android.text.format.DateFormat')的对象。 - Arye Rosenstein
2
@Harsha - 为了解决这个问题,我将我的DateFormat使用链接起来,这样我只需要引用Android类,因此就不会有任何模糊的类。最终字符串日期 = DateFormat.getDateFormat(this).format(d);您可以使用Android的format()方法,这样代码更加简洁,而且少实例化一个对象(在我看来)。 - Jerry Brady
23
这个格式化程序只包含日期,不包括时间,与原问题所述不同。请改用同一软件包中的DateUtils,参见https://dev59.com/Y3A85IYBdhLWcg3wBOtO - Asmo Soinio
显示剩余4条评论

233

我认为android.text.format.DateFormat.getDateFormat(context)这个方法让我感到困惑,因为它返回的是java.text.DateFormat而不是android.text.format.DateFormat - -"。

所以,我使用以下代码片段以我的格式获取当前日期/时间。

android.text.format.DateFormat df = new android.text.format.DateFormat();
df.format("yyyy-MM-dd hh:mm:ss a", new java.util.Date());

or

android.text.format.DateFormat.format("yyyy-MM-dd hh:mm:ss a", new java.util.Date());

此外,您可以使用其他格式。请参考DateFormat


25
有用的,但问题中提到“根据设备配置”。在我看来,这意味着使用基于用户语言/国家选择的格式,或由用户直接选择,而不是硬编码格式的选择。 - Chris Boyle
21
不要忘记,对于下午1点,“hh:mm:ss”会给出“01:00:00”,您需要使用“kk:mm:ss”才能得到“13:00:00”。 - dnet
3
@dnet,“k”代表一天中的小时数(1-24),难道你不是指“H”,它代表一天中的小时数(0-23),例如HH:mm:ss吗? 参考链接:http://developer.android.com/reference/java/text/SimpleDateFormat.html - Joony
2
@Joony 不,java.text.SimpleDateFormat(你提供的链接,使用 H 表示 0-23 范围内的小时)和 android.text.format.DateFormat(回答所涉及的内容,使用 k 表示 0-23 范围内的小时)之间是有区别的。 - dnet
似乎在android.text.format.DateFormat中,format是一个静态方法。 - Muthukannan Kanniappan
显示剩余3条评论

223
你可以使用DateFormat。结果取决于手机的默认区域设置,但你也可以指定区域设置:

https://developer.android.com/reference/java/text/DateFormat.html

这是在一个中文环境下的结果:

DateFormat.getDateInstance().format(date)                                          

法国本地时间: 2017年11月3日

美国/英语本地时间: 1952年1月12日


DateFormat.getDateInstance(DateFormat.SHORT).format(date)

法国地区:2017年3月11日

美国/英国地区:12:13:52


DateFormat.getDateInstance(DateFormat.MEDIUM).format(date)

法国本地日期:2017年11月3日

美国/英语本地日期:1952年1月12日


DateFormat.getDateInstance(DateFormat.LONG).format(date)

FR本地时间:2017年11月3日

US/En本地时间:1952年1月12日


DateFormat.getDateInstance(DateFormat.FULL).format(date)

FR语言环境:2017年11月3日星期五

US/En语言环境:1952年4月12日星期二


DateFormat.getDateTimeInstance().format(date)

法国本地时间:2017年11月3日16:04:58


DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(date)

法国本地化:2017年03月11日 16:04


DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM).format(date)

法语区域设置:03/11/2017 16:04:58


DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.LONG).format(date)

法国地区:2017年03月11日 16:04:58 GMT+01:00


DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.FULL).format(date)

法国本地时间:2017年03月11日16:04:58欧洲中部标准时间


DateFormat.getTimeInstance().format(date)

法国本地时间:16:04:58


DateFormat.getTimeInstance(DateFormat.SHORT).format(date)

法语区域设置:16:04


DateFormat.getTimeInstance(DateFormat.MEDIUM).format(date)

法国本地时间:16:04:58


DateFormat.getTimeInstance(DateFormat.LONG).format(date)

法国语言环境:16:04:58 GMT+01:00


DateFormat.getTimeInstance(DateFormat.FULL).format(date)

法语区域设置:欧洲中部标准时间16:04:58



8
谢谢你把所有这些案例放在一个地方。如果您能够添加仅涉及时间的案例,这将使其成为一个完整的参考资料。 - zeeshan
1
我想知道为什么文档不是很详尽,非常感谢。 - Perry
对于模式方法,请使用DateFormat.getPatternInstance("dMMMMyyyyHHmm", Locale.ENGLISH).format(date) -> December 23, 2005, 17:37 - Nikolay Krasilnikov
它实际上显示的是上午和下午,而不是24小时制,如何修复这个问题? - undefined

43

将日期转换为本地日期字符串:

Date date = new Date();
String stringDate = DateFormat.getDateTimeInstance().format(date);

选项:

   DateFormat.getDateInstance() 

- > 1969年12月31日
   DateFormat.getDateTimeInstance() 

-> 1969年12月31日 下午4:00:00

   DateFormat.getTimeInstance() 

-> 下午4:00:00


3
如何从DateFormat.getDateInstance()中去除年份? - Hardik Joshi

25

日期和时间格式解释

EEE : Day ( Mon )
MMMM : Full month name ( December ) // MMMM February   
MMM : Month in words ( Dec )
MM : Month ( 12 )
dd : Day in 2 chars ( 03 )
d: Day in 1 char (3)
HH : Hours ( 12 )
mm : Minutes ( 50 )
ss : Seconds ( 34 )
yyyy: Year ( 2020 ) //both yyyy and YYYY are same
YYYY: Year ( 2020 )
zzz : GMT+05:30
a : ( AM / PM )
aa : ( AM / PM )
aaa : ( AM / PM )
aaaa : ( AM / PM )

3
有时候使用大写的 "YYYY" 可能会导致错误,建议使用小写的 "yyyy"。 - Kirk_hehe
1
小写的“hh”表示12小时制时间,大写的“HH”表示24小时制时间。 - Bibaswann Bandyopadhyay
这可能有用,但并没有直接回答问题。 - undefined

21

下面这个代码可以实现此功能:

Date date = new Date();
java.text.DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());
mTimeText.setText("Time: " + dateFormat.format(date));

当用户在Android设备上更改语言时,这个会被本地化吗? - Kannan_SJD

17

使用SimpleDateFormat

像这样:

event.putExtra("starttime", "12/18/2012");

SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");
Date date = format.parse(bundle.getString("starttime"));

5
是的,使用默认语言环境以避免性能问题:new SimpleDateFormat("my-format", Locale.getDefault()); - iutinvg

16

这是最简单的方法:

    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a", Locale.US);

    String time = df.format(new Date());

如果你正在寻找日期格式,请查阅此链接


14

1
根据您提供的链接,@FireZenk:这个类存在许多问题,建议使用GregorianCalendar代替。 - ccpizza
1
哦...这个问题信息比我的评论更新,所以那是一个已弃用的答案。 - FireZenk

10

将这两个变量作为类变量使用:

 public java.text.DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
 private Calendar mDate = null;

然后像这样使用:

 mDate = Calendar.getInstance();
 mDate.set(year,months,day);                   
 dateFormat.format(mDate.getTime());

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