如何在 Android 中获取当前时间和日期

如何在 Android 应用中获取当前时间和日期?

答案

您可以使用:

import java.util.Calendar

Date currentTime = Calendar.getInstance().getTime();

输出 - 周四 12 月 19 日 18:53:43 GMT + 05:30

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault());

//You can change "yyyyMMdd_HHmmss as per your requirement 

String currentDateandTime = sdf.format(new Date());

输出 -20191219_185343

日历中有很多常量可以满足您的所有需求。

编辑:
查看日历类文档

您可以( 但不再需要 - 参见下文!)使用android.text.format.Time

Time now = new Time();
now.setToNow();

根据上面链接的参考:

Time 类可以更快地替换 java.util.Calendar 和 java.util.GregorianCalendar 类。 Time 类的实例表示时刻,以秒精度指定。


注意 1:自从我写了这个答案已经好几年了,它是关于一个旧的,特定于 Android 的类,现在已弃用的类。 Google 现在 “他的课程有很多问题,建议改用GregorianCalendar ”。


注意 2:即使Time类具有toMillis(ignoreDaylightSavings)方法,这也只是传递给期望时间以毫秒为单位的方法的便利。时间值仅精确到一秒 ;毫秒部分始终为000 。如果在循环中

Time time = new Time();   time.setToNow();
Log.d("TIME TEST", Long.toString(time.toMillis(false)));
... do something that takes more than one millisecond, but less than one second ...

生成的序列将重复相同的值,例如1410543204000 ,直到下一秒开始,此时1410543205000将开始重复。

如果要以特定模式获取日期和时间,可以使用以下命令:

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault());
String currentDateandTime = sdf.format(new Date());

要么,

日期

String currentDate = new SimpleDateFormat("dd-MM-yyyy", Locale.getDefault()).format(new Date());

时间:

String currentTime = new SimpleDateFormat("HH:mm:ss", Locale.getDefault()).format(new Date());

对于那些可能更喜欢自定义格式的用户,可以使用:

DateFormat df = new SimpleDateFormat("EEE, d MMM yyyy, HH:mm");
String date = df.format(Calendar.getInstance().getTime());

而您可以使用 DateFormat 模式,例如:

"yyyy.MM.dd G 'at' HH:mm:ss z" ---- 2001.07.04 AD at 12:08:56 PDT
"hh 'o''clock' a, zzzz" ----------- 12 o'clock PM, Pacific Daylight Time
"EEE, d MMM yyyy HH:mm:ss Z"------- Wed, 4 Jul 2001 12:08:56 -0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ"------- 2001-07-04T12:08:56.235-0700
"yyMMddHHmmssZ"-------------------- 010704120856-0700
"K:mm a, z" ----------------------- 0:08 PM, PDT
"h:mm a" -------------------------- 12:08 PM
"EEE, MMM d, ''yy" ---------------- Wed, Jul 4, '01

实际上,使用Time.getCurrentTimezone()设置设备上设置的当前时区是比较安全的,否则您将获得以 UTC 为单位的当前时间。

Time today = new Time(Time.getCurrentTimezone());
today.setToNow();

然后,您可以获得所需的所有日期字段,例如:

textViewDay.setText(today.monthDay + "");             // Day of the month (1-31)
textViewMonth.setText(today.month + "");              // Month (0-11)
textViewYear.setText(today.year + "");                // Year 
textViewTime.setText(today.format("%k:%M:%S"));  // Current time

有关所有详细信息,请参见android.text.format.Time类。

更新

正如许多人指出的那样,Google 表示此类存在许多问题,因此不应再使用:

此类有很多问题,建议改用 GregorianCalendar。

已知的问题:

由于历史原因,执行时间计算时,目前所有算术均使用 32 位整数进行。这限制了从 1902 年到 2037 年可以表示的可靠时间范围。有关详细信息,请参阅 Wikipedia 文章有关 2038 年问题。不要依靠这种行为;将来可能会改变。在不存在的日期上调用 switchTimezone(String),例如由于 DST 转换而跳过的挂墙时间,将导致 1969 年的日期(即 - 1,即 1970 年 1 月 1 日 UTC 之前的 1 秒)。大多数格式 / 解析都假定使用 ASCII 文本,因此不适合与非 ASCII 脚本一起使用。

对于当前日期和时间,请使用:

String mydate = java.text.DateFormat.getDateTimeInstance().format(Calendar.getInstance().getTime());

哪个输出:

Feb 27, 2012 5:41:23 PM

尝试这种方式下面给出所有格式以获取日期和时间格式。

Calendar c = Calendar.getInstance();
    SimpleDateFormat dateformat = new SimpleDateFormat("dd-MMM-yyyy hh:mm:ss aa");
    String datetime = dateformat.format(c.getTime());
    System.out.println(datetime);

第一

第二 第三

要生成当前时间,可以使用 Java 中标准的System.currentTimeMillis() 。然后你可以用它来创建一个日期

Date currentDate = new Date(System.currentTimeMillis());

并像别人提到的那样创造了时间

Time currentTime = new Time();
currentTime.setToNow();

tl; dr

Instant.now()  // Current moment in UTC.

… 要么…

ZonedDateTime.now( ZoneId.of( "America/Montreal" ) )  // In a particular time zone

细节

其他答案虽然正确,但已过时。事实证明,旧的日期时间类设计不良,令人困惑且麻烦。

java.time

那些旧类已被java.time框架取代。

这些新类的灵感来自由 JSR 310定义并由ThreeTen-Extra项目扩展的非常成功的Joda-Time项目。

请参阅《 Oracle 教程》

Instant

InstantUTC时间线上的时刻,分辨率高达纳秒

Instant instant = Instant.now(); // Current moment in UTC.

时区

应用时区( ZoneId )以获取ZonedDateTime 。如果省略时区,则将隐式应用 JVM 的当前默认时区。最好明确指定所需 / 预期的时区。

使用continent/region格式的正确时区名称 ,例如America/MontrealEurope/BrusselsAsia/Kolkata 。切勿使用ESTIST等 3-4 个字母的缩写,因为它们既不是标准化的也不是唯一的。

ZoneId zoneId = ZoneId.of( "America/Montreal" ); // Or "Asia/Kolkata", "Europe/Paris", and so on.
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

Java中的日期时间类型表(现代和旧式)

产生字串

您可以轻松地生成一个String作为日期时间值的文本表示形式。您可以使用标准格式,自己的自定义格式或自动本地化格式。

ISO 8601

您可以调用toString方法以使用通用且合理的ISO 8601标准格式化文本。

String output = instant.toString();

2016-03-23T03:09:01.613Z

请注意,对于ZonedDateTimetoString方法通过将时区的名称附加在方括号中来扩展 ISO 8601 标准。极其有用和重要的信息,但不是标准的。

2016-03-22T20:09:01.613-08:00 [美国 / 洛杉矶]

自订格式

或使用DateTimeFormatter类指定自己的特定格式设置模式。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "dd/MM/yyyy hh:mm a" );

指定人类语言(英语, 法语等)的语言Locale ,以翻译日 / 月的名称以及定义文化规范(例如年,月和日的顺序)。请注意, Locale与时区无关。

formatter = formatter.withLocale( Locale.US ); // Or Locale.CANADA_FRENCH or such.
String output = zdt.format( formatter );

本地化

更好的是,让 java.time 自动执行本地化工作。

DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM );
String output = zdt.format( formatter.withLocale( Locale.US ) );  // Or Locale.CANADA_FRENCH and so on.

关于java.time

下表列出了在Java和Android的哪个版本上使用* java.time *技术的哪种实现。

java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧的旧式日期时间类,例如java.util.DateCalendarSimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参见Oracle 教程 。并在 Stack Overflow 中搜索许多示例和说明。规格为JSR 310

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

在哪里获取 java.time 类?

ThreeTen-Extra项目使用其他类扩展了 java.time。该项目为将来可能在 java.time 中添加内容提供了一个试验场。您可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter ,和更多

您可以使用以下代码:

Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String strDate = sdf.format(c.getTime());

输出:

2014-11-11 00:47:55

您还可以从此处获得SimpleDateFormat更多格式选项。