提问



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

最佳参考


你可以使用:


import java.util.Calendar

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


日历中有很多常量可供您使用。


编辑:结果
检查日历类文档[79]

其它参考1


你可以(但不再应该 - 见下文!)使用android.text.format.Time:[80]


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


从上面链接的参考:



  Time类是一个更快的替代品
  对于java.util.Calendar和
  java.util.GregorianCalendar类。
  Time类的一个实例
  表示指定的时刻
  具有第二精度。






注1:
我写这个答案已经好几年了,
它是关于旧的,特定于Android的,现在已弃用的类。
谷歌现在说
[[t]]他的班级有很多问题,建议改用GregorianCalendar。[81] [82]





注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将开始重复。

其它参考2


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


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

其它参考3


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


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

其它参考4


实际上,使用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类。[83]


更新


正如许多人指出的那样,谷歌表示这个类有很多问题,不应该再使用了:



  这个课有很多问题,建议这样做
  使用GregorianCalendar代替。

  
  已知的问题:

  
  由于历史原因所有进行时间计算
  算术当前使用32位整数进行。这限制了
  可靠的时间范围可以追溯到1902年至2037年。见
  关于2038年问题的维基百科文章的详细信息。不要依赖
  这种行为;它可能会在未来发生变化。调用
  switchTimezone(String)在一个不存在的日期,例如墙
  由于DST转换而跳过的时间将导致日期
  1969年(即1970年1月1日UTC之前的-1或1秒)。大部分
  格式化/解析假定为ASCII文本,因此不适合
  用于非ASCII脚本。


其它参考5


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


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


哪个输出:


Feb 27, 2012 5:41:23 PM

其它参考6


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


    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);


[84]



[85] [86]

其它参考7


要获得当前时间,您可以使用Java中标准的System.currentTimeMillis()。然后,您可以使用它来创建日期


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


而正如别人所说,创造时间


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

其它参考8


您可以使用以下代码:


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的更多格式选项。[87]

其它参考9


很简单,您可以剖析时间来获取当前时间的单独值,如下所示:


Calendar cal = Calendar.getInstance(); 

  int millisecond = cal.get(Calendar.MILLISECOND);
  int second = cal.get(Calendar.SECOND);
  int minute = cal.get(Calendar.MINUTE);
        //12 hour format
  int hour = cal.get(Calendar.HOUR);
        //24 hour format
  int hourofday = cal.get(Calendar.HOUR_OF_DAY);


日期相同,如下:


Calendar cal = Calendar.getInstance(); 

  int dayofyear = cal.get(Calendar.DAY_OF_YEAR);
  int year = cal.get(Calendar.YEAR);
  int dayofweek = cal.get(Calendar.DAY_OF_WEEK);
  int dayofmonth = cal.get(Calendar.DAY_OF_MONTH);

其它参考10


TL;博士



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


... ...或



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


详细



其他答案虽然正确,但已经过时了。旧的日期时间类已被证明设计糟糕,令人困惑,并且很麻烦。


java.time



这些旧类已被java.time框架取代。 [88]



  • Java 8及更高版本:java.time框架是内置的。

  • Java 7& 6:使用java.time的backport。

  • Android:使用该backport的这个包装版本。



这些新课程的灵感来自于由JSR 310定义并由ThreeTen-Extra项目扩展的非常成功的Joda-Time项目。[89] [90] [91] [92] [93] [94]


请参阅Oracle教程。[95]


Instant



Instant是UTC时间轴上的一个时刻,分辨率高达纳秒。[96] [97] [98]


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


时区



应用时区(ZoneId)来获得ZonedDateTime。如果省略时区,则会隐式应用JVM的当前默认时区。最好明确指定期望/预期的时区。[99] [100]


使用continent/region格式的适当时区名称,如America/MontrealEurope/BrusselsAsia/Kolkata。切勿使用ESTIST之类的3-4个字母缩写,因为它们既不是标准也不是唯一。[101] [102] [103] [104]


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


生成字符串



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


ISO 8601



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


String output = instant.toString();



  2016-03-23T03:09:01.613Z



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



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



自定义格式



或者使用DateTimeFormatter类指定您自己的特定格式模式。[106]


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


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


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.time 框架内置于Java 8及更高版本中。这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendar和& SimpleDateFormat[109] [110] [111] [112] [113]


现在处于维护模式的 Joda-Time 项目建议迁移到java.time类。[114] [115] [116]


要了解更多信息,请参阅 Oracle Tutorial 。并搜索Stack Overflow以获取许多示例和解释。规格是JSR 310。[117] [118]


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


从哪里获取java.time类?



  • Java SE 8 Java SE 9 Java SE 10 以及更高版本


    • 内置。

    • 带有捆绑实现的标准Java API的一部分。

    • Java 9增加了一些小功能和修复。


  • Java SE 6 Java SE 7


    • 大部分java.time功能都被反向移植到Java 6& 7 ThreeTen-Backport


  • 的Android


    • 更新版本的Android捆绑java.time类的实现。

    • 对于早期的Android(< 26), ThreeTenABP 项目会调整 ThreeTen-Backport (如上所述)。请参阅如何使用ThreeTenABP ... 。




ThreeTen-Extra 项目使用其他类扩展了java.time。该项目是未来可能添加到java.time的试验场。你可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter等等。[121] [122] [123] [124] [125] [126] [127] [128] [130] [131] [132] [133] [134]

其它参考11


有几个选项,因为Android主要是Java,但是如果你想在textView中编写它,下面的代码可以解决这个问题:


String currentDateTimeString = DateFormat.getDateInstance().format(new Date());

// textView is the TextView view that should display it
textView.setText(currentDateTimeString);

其它参考12


SimpleDateFormat databaseDateTimeFormate = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
SimpleDateFormat databaseDateFormate = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sdf1 = new SimpleDateFormat("dd.MM.yy");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy.MM.dd G 'at' hh:mm:ss z");
SimpleDateFormat sdf3 = new SimpleDateFormat("EEE, MMM d, ''yy");
SimpleDateFormat sdf4 = new SimpleDateFormat("h:mm a");
SimpleDateFormat sdf5 = new SimpleDateFormat("h:mm");
SimpleDateFormat sdf6 = new SimpleDateFormat("H:mm:ss:SSS");
SimpleDateFormat sdf7 = new SimpleDateFormat("K:mm a,z");
SimpleDateFormat sdf8 = new SimpleDateFormat("yyyy.MMMMM.dd GGG hh:mm aaa");


String currentDateandTime = databaseDateTimeFormate.format(new Date());     //2009-06-30 08:29:36
String currentDateandTime = databaseDateFormate.format(new Date());     //2009-06-30
String currentDateandTime = sdf1.format(new Date());     //30.06.09
String currentDateandTime = sdf2.format(new Date());     //2009.06.30 AD at 08:29:36 PDT
String currentDateandTime = sdf3.format(new Date());     //Tue, Jun 30, '09
String currentDateandTime = sdf4.format(new Date());     //8:29 PM
String currentDateandTime = sdf5.format(new Date());     //8:29
String currentDateandTime = sdf6.format(new Date());     //8:28:36:249
String currentDateandTime = sdf7.format(new Date());     //8:29 AM,PDT
String currentDateandTime = sdf8.format(new Date());     //2009.June.30 AD 08:29 AM


日期格式模式


G   Era designator (before christ, after christ)
y   Year (e.g. 12 or 2012). Use either yy or yyyy.
M   Month in year. Number of M's determine length of format (e.g. MM, MMM or MMMMM)
d   Day in month. Number of d's determine length of format (e.g. d or dd)
h   Hour of day, 1-12 (AM / PM) (normally hh)
H   Hour of day, 0-23 (normally HH)
m   Minute in hour, 0-59 (normally mm)
s   Second in minute, 0-59 (normally ss)
S   Millisecond in second, 0-999 (normally SSS)
E   Day in week (e.g Monday, Tuesday etc.)
D   Day in year (1-366)
F   Day of week in month (e.g. 1st Thursday of December)
w   Week in year (1-53)
W   Week in month (0-5)
a   AM / PM marker
k   Hour in day (1-24, unlike HH's 0-23)
K   Hour in day, AM / PM (0-11)
z   Time Zone

其它参考13


final Calendar c = Calendar.getInstance();
    int mYear = c.get(Calendar.YEAR);
    int mMonth = c.get(Calendar.MONTH);
    int mDay = c.get(Calendar.DAY_OF_MONTH);

textView.setText(""+mDay+"-"+mMonth+"-"+mYear);

其它参考14


你也可以使用android.os.SystemClock。
例如,当手机处于睡眠状态时,SystemClock.elapsedRealtime()将为您提供更准确的时间读数。

其它参考15


Time time = new Time();
time.setToNow();
System.out.println("time: " + time.hour+":"+time.minute);


例如,这将给你12:32。


记得导入android.text.format.Time;

其它参考16


    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    Calendar cal = Calendar.getInstance();
    System.out.println("time => " + dateFormat.format(cal.getTime()));

    String time_str = dateFormat.format(cal.getTime());

    String[] s = time_str.split(" ");

    for (int i = 0; i < s.length; i++) {
         System.out.println("date  => " + s[i]);
    }

    int year_sys = Integer.parseInt(s[0].split("/")[0]);
    int month_sys = Integer.parseInt(s[0].split("/")[1]);
    int day_sys = Integer.parseInt(s[0].split("/")[2]);

    int hour_sys = Integer.parseInt(s[1].split(":")[0]);
    int min_sys = Integer.parseInt(s[1].split(":")[1]);

    System.out.println("year_sys  => " + year_sys);
    System.out.println("month_sys  => " + month_sys);
    System.out.println("day_sys  => " + day_sys);

    System.out.println("hour_sys  => " + hour_sys);
    System.out.println("min_sys  => " + min_sys);

其它参考17


这是一种有助于获取日期和时间的方法:


private String getDate(){
    DateFormat dfDate = new SimpleDateFormat("yyyy/MM/dd");
    String date=dfDate.format(Calendar.getInstance().getTime());
    DateFormat dfTime = new SimpleDateFormat("HH:mm");
    String time = dfTime.format(Calendar.getInstance().getTime());
    return date + " " + time;
}


您可以调用此方法并获取当前日期和时间值:


2017/01//09 19:23

其它参考18


对于自定义的时间和日期格式:


    SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZZ",Locale.ENGLISH);
    String cDateTime=dateFormat.format(new Date());


输出如下格式:
2015-06-18T10:15:56-05:00

其它参考19


您可以使用以下方式获取日期:


Time t = new Time(Time.getCurrentTimezone());
t.setToNow();
String date = t.format("%Y/%m/%d");


这将以一个很好的形式给你一个结果,如在这个例子中:2014/02/09。

其它参考20


如果你需要当前日期,


Calendar cc = Calendar.getInstance();
int year=cc.get(Calendar.YEAR);
int month=cc.get(Calendar.MONTH);
int mDay = cc.get(Calendar.DAY_OF_MONTH);
System.out.println("Date", year+":"+month+":"+mDay);


如果你需要当前时间,


 int mHour = cc.get(Calendar.HOUR_OF_DAY);
 int mMinute = cc.get(Calendar.MINUTE);
 System.out.println("time_format"+String.format("%02d:%02d", mHour , mMinute ));

其它参考21


Date todayDate = new Date();
todayDate.getDay();
todayDate.getHours();
todayDate.getMinutes();
todayDate.getMonth();
todayDate.getTime();

其它参考22


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


试试这个也适合我。

其它参考23


您只需使用以下代码:


 DateFormat df = new SimpleDateFormat("HH:mm"); //format time
 String time = df.format(Calendar.getInstance().getTime());

 DateFormat df1=new SimpleDateFormat("yyyy/MM/dd");//foramt date
 String date=df1.format(Calendar.getInstance().getTime());

其它参考24


尝试这个


String mytime = (DateFormat.format("dd-MM-yyyy hh:mm:ss", new java.util.Date()).toString());

其它参考25


下面的方法将以字符串形式返回当前日期和时间,根据您的实际时区使用不同的时区。我使用过GMT


public static String GetToday(){
    Date presentTime_Date = Calendar.getInstance().getTime();
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
    return dateFormat.format(presentTime_Date);
}

其它参考26


您应该根据新的API使用Calender类。现在不推荐使用日期类。


Calendar cal = Calendar.getInstance();

String date = ""+cal.get(Calendar.DATE)+"-"+(cal.get(Calendar.MONTH)+1)+"-"+cal.get(Calendar.YEAR);

String time = ""+cal.get(Calendar.HOUR_OF_DAY)+":"+cal.get(Calendar.MINUTE);

其它参考27


尝试使用此代码显示当前日期和时间


 Date date = new Date(System.currentTimeMillis());
 SimpleDateFormat dateFormat = new SimpleDateFormat("hh:mm aa",
                         Locale.ENGLISH);
 String var = dateFormat.format(date));

其它参考28


我有一些API的答案问题,所以我融合了这些代码,我希望它能为他们服务:


    Time t = new Time(Time.getCurrentTimezone());
    t.setToNow();
    String date1 = t.format("%Y/%m/%d");

    Date date = new Date(System.currentTimeMillis());
    SimpleDateFormat dateFormat = new SimpleDateFormat("hh:mm aa",
            Locale.ENGLISH);
    String var = dateFormat.format(date);
    String horafecha = var+ " - " + date1;

    tvTime.setText(horafecha);


输出:
       03:25 PM - 2017/10/03

其它参考29


尝试使用以下代码:


 Date date = new Date();
 SimpleDateFormat dateFormatWithZone = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",Locale.getDefault());  
 String currentDate = dateFormatWithZone.format(date);