获取给定时区的当前时间:android

我是Android的新手,我目前面临的问题是获得时区的当前时间。

我以“GMT-7”格式得到时区,即字符串。 我有系统时间。

有没有一种干净的方法来获得上述时区的当前时间? 任何帮助表示赞赏。 谢谢,

编辑:尝试这样做:

public String getTime(String timezone) { Calendar c = Calendar.getInstance(); c.setTimeZone(TimeZone.getTimeZone(timezone)); Date date = c.getTime(); SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy"); String strDate = df.format(date); return c.getTime().toString(); } 

我让它像这样工作:

 TimeZone tz = TimeZone.getTimeZone("GMT+05:30"); Calendar c = Calendar.getInstance(tz); String time = String.format("%02d" , c.get(Calendar.HOUR_OF_DAY))+":"+ String.format("%02d" , c.get(Calendar.MINUTE))+":"+ . String.format("%02d" , c.get(Calendar.SECOND))+":"+ . String.format("%03d" , c.get(Calendar.MILLISECOND)); 

java.time

与Java和第三方Joda-Time库捆绑在一起的旧日期时间类已被Java 8及更高版本中内置的java.time框架所取代。 这些类取代了旧的麻烦的日期时间类,如java.util.Date 。 请参阅Oracle教程 。 大部分java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7,并进一步适应了ThreeTenABP中的 Android。

顺便说一句,永远不要使用单个数字小时(例如-7来引用与UTC的偏移量 ,因为这是非标准的,并且与各种协议和库不兼容。 始终使用零填充第二个数字,例如-07

如果只有偏移而不是时区,请使用OffsetDateTime类。

 ZoneOffset offset = ZoneOffset.ofHours( -7 ); OffsetDateTime odt = OffsetDateTime.now( offset ); String output1 = odt.toLocalTime().toString(); System.out.println( "Current time in " + offset + ": " + output1 ); 

当前时间-07:00:19:41:36.525

如果您有一个全时区(一个偏移量加上一组用于处理夏令时(DST)等exception的规则,而不是仅仅偏离UTC的偏移量),请使用ZonedDateTime类。

 ZoneId denverTimeZone = ZoneId.of( "America/Denver" ); ZonedDateTime zdt = ZonedDateTime.now( denverTimeZone ); String output2 = zdt.toLocalTime().toString(); System.out.println( "Current time in " + denverTimeZone + ": " + output2 ); 

美国/丹佛当前时间:20:41:36.560

请参阅Ideone.com中的此代码 。

乔达时间

您可以在Android中使用Joda-Time 2.7。 使日期时间工作更容易。

 DateTimeZone zone = DateTimeZone.forID ( "America/Denver" ); DateTime dateTime = new DateTime ( zone ); String output = dateTime.toLocalTime ().toString (); 

转储到控制台。

 System.out.println ( "zone: " + zone + " | dateTime: " + dateTime + " | output: " + output ); 

跑的时候……

区:美国/丹佛| dateTime:2016-07-11T20:50:17.668-06:00 | 输出:20:50:17.668

自大纪元以来的数量

我强烈建议不要按时间跟踪计数。 但是如果有必要,你可以通过在DateTime上调用getMillis方法来提取Joda-Time的内部毫秒 – 自 – 纪元( Unix时间 ,1970年第一时刻)。

注意使用64位long而不是32位的int 基本types 。

在java.time中。 请记住,您可能会丢失数据,因为java.time的分辨率高达纳秒。 从纳秒到毫秒意味着截断一个小数秒的六位数(3位为毫秒,9位为纳秒)。

 long millis = Instant.now ().toEpochMilli (); 

在Joda-Time。

 long millis = DateTime.now( denverTimeZone ).getMillis(); 
 Calendar cal = Calendar.getInstance(); TimeZone tz = cal.getTimeZone(); Log.d("Time zone","="+tz.getDisplayName()); 

尝试这个:

 SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy"); df.setTimeZone(TimeZone.getTimeZone("YOUR_TIMEZONE")); String strDate = df.format(date); 

YOUR_TIMEZONE可能类似于:GMT,UTC,GMT-5等。

将时区设置为格式化程序,而不是日历:

 public String getTime(String timezone) { Calendar c = Calendar.getInstance(); Date date = c.getTime(); //current date and time in UTC SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy"); df.setTimeZone(TimeZone.getTimeZone(timezone)); //format in given timezone String strDate = df.format(date); return strDate; } 

是的你可以。 通过调用TimeZone setDefault()方法。

 public String getTime(String timezone) { TimeZone defaultTz = TimeZone.getDefault(); TimeZone.setDefault(TimeZone.getTimeZone(timezone)); Calendar cal = Calendar.getInstance(); Date date = cal.getTime(); String strDate = date.toString(); // Reset Back to System Default TimeZone.setDefault(defaultTz); return strDate; } 
  TimeZone tz = TimeZone.getTimeZone(TimeZoneID); Calendar c= Calendar.getInstance(tz); String time=new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new Date(cal.getTimeInMillis())); 

根据您的选择,TimeZoneID可以是下面的一个

 String[] ids=TimeZone.getAvailableIDs(); 

那么时间可以按照上面接受的答案得到

 String time = String.format("%02d" , c.get(Calendar.HOUR_OF_DAY))+":"+ String.format("%02d" , c.get(Calendar.MINUTE))+":"+ String.format("%02d" , c.get(Calendar.SECOND))+":"+ String.format("%03d" , c.get(Calendar.MILLISECOND)); 

我发现了一种更好,更简单的方法。

首先设置app的时区使用

  TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles")); 

然后调用Calander在内部获取日期,它使用上面通过app设置的默认时区。

  Calendar cal = Calendar.getInstance(); Log.d("Los angeles time ",cal.getTime().toString()); 

它将根据时区给出当前时间。

D /洛杉矶时间:周六6月21日13:52:25 PDT 2018

最简洁的方法是使用SimpleDateFormat

 SimpleDateFormat = SimpleDateFormat("MMM\nd\nh:mm a", Locale.getDefault()) 

或者您可以指定区域设置