我该如何在Android应用中获取当前的时间和日期?
你可以使用:
import java.util.Calendar;
import java.util.Date;
Date currentTime = Calendar.getInstance().getTime();
日历中有丰富的常量,可满足您的所有需求。
请查看日历类文档。
Calendar.getInstance().getTime()
或 Calendar.getInstance().getTimeInMillis()
都可以使用。 - akousmataTime now = new Time();
now.setToNow();
从上面链接引用的内容:
Time类是java.util.Calendar和java.util.GregorianCalendar类的更快替代品。 Time类的实例表示一个以秒为精度的时间点。
注1:距我撰写此答案已经过去几年,而且它涉及一个旧的、特定于Android的、现在已弃用的类。Google现在说“[t]这个类有很多问题,建议使用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
将开始重复。
SystemClock.uptimeMillis()
来实现间隔计时。由于大多数内置函数都使用它,因此有强烈的动力使其在所有设备上得到很好的实现。请参见SystemClock中的讨论...如果您想将其与时间相关联,在应用程序的onResume方法中,同时读取SystemClock.uptimeMillis()
和Time类中的setToNow()
和toMillis()
方法。请记住这些方法之间的区别。 - ToolmakerSteveGregorianCalendar
早已被java.time类所取代,具体而言是ZonedDateTime
。对于早期的Android版本,请参阅ThreeTen-Backport和ThreeTenABP项目。 - Basil Bourque如果您想按照指定的格式获取日期和时间,可以使用以下方法:
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());
onDraw()
方法内创建了一个新的SimpleDateFormat
实例吗? - xmensdf.setTimeZone(TimeZone.getDefault())
。 - Harvey如果您更喜欢自定义格式,可以使用以下方法:
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)将导致1969年的日期(即1970年1月1日UTC之前的1秒)。大部分格式化/解析假定ASCII文本,因此不适合与非ASCII脚本一起使用。
Instant.now() // Current moment in UTC.
…或者…
ZonedDateTime.now( ZoneId.of( "America/Montreal" ) ) // In a particular time zone
其他答案虽然正确,但已过时。旧的日期时间类被证明设计不佳,令人困惑和麻烦。
旧的类已被 java.time 框架取代。
这些新类受到 Joda-Time 项目的启发,由 JSR 310 定义,并由 ThreeTen-Extra 项目扩展。
请查看Oracle教程。
Instant
Instant
是一个时间线上的瞬间,以UTC为标准,分辨率高达纳秒级。
Instant instant = Instant.now(); // Current moment in UTC.
应用一个时区(ZoneId
)来获取一个ZonedDateTime
。如果你省略了时区,你的JVM当前默认的时区将被隐式应用。最好明确指定所需/期望的时区。
使用格式为continent/region
的适当的时区名称,例如America/Montreal
、Europe/Brussels
或Asia/Kolkata
。永远不要使用3-4个字母的缩写,如EST
或IST
,因为它们既没有标准化,也不是唯一的。
ZoneId zoneId = ZoneId.of( "America/Montreal" ); // Or "Asia/Kolkata", "Europe/Paris", and so on.
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
您可以轻松地生成一个String
作为日期时间值的文本表示。您可以选择标准格式、自定义格式或自动本地化格式。
您可以调用toString
方法以使用常见且明智的ISO 8601标准进行格式化的文本。
String output = instant.toString();
请注意,对于2016-03-23T03:09:01.613Z
ZonedDateTime
,toString
方法通过在方括号中添加时区名称来扩展ISO 8601标准。这是非常有用和重要的信息,但不是标准的。
2016-03-22T20:09:01.613-08:00[America/Los_Angeles]
或者使用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 8 及更高版本中。这些类替代了过时的旧版日期时间类,例如 java.util.Date
, Calendar
, 和 SimpleDateFormat
。
您可以直接使用与JDBC 4.2或更高版本兼容的JDBC驱动程序,无需使用字符串或java.sql.*
类,即可直接将java.time对象与数据库交换。Hibernate 5和JPA 2.2支持java.time。
如何获取java.time类?
Instant.now()
和ZonedDateTime.now()
需要API 26。 - Ryde使用以下代码获取当前日期和时间:
String mydate = java.text.DateFormat.getDateTimeInstance().format(Calendar.getInstance().getTime());
输出结果为:
Feb 27, 2012 5:41:23 PM
要获取当前时间,你可以使用Java中的标准方法System.currentTimeMillis()
来获取。然后,你可以使用它来创建一个日期。
Date currentDate = new Date(System.currentTimeMillis());
正如其他人所提到的,要创建一个时间
Time currentTime = new Time();
currentTime.setToNow();
Cannot resolve constructor Date()
错误,这是因为安卓SDK使用了Java 6和7的混合版本。 - treadnew Date(System.currentTimeMillis())
是不正确的:(a)它是多余的,因为这与 new Date()
完全相同。 (b) 令人烦恼的 java.util.Date
类现在已被 java.time.Instant
取代,从 Java 8 开始。在 ThreeTen-Backport 项目中回溯到 Java 6 和 7,在早期的 Android (<26) 中则使用 ThreeTenABP。 - Basil Bourque您可以使用以下代码:
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
的更多格式选项。
java.util.Date
、java.util.Calendar
和java.text.SimpleDateFormat
这样的老旧日期时间类现在已经成为遗留系统,被内置于Java 8及更高版本中的java.time类所取代。请参阅Oracle的教程。 - Basil Bourque