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

时间:2013-04-24 21:59:02

标签: java android android-date

我是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();
}

10 个答案:

答案 0 :(得分:21)

我让它像这样工作:

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

答案 1 :(得分:12)

java.time

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

顺便说一下,永远不要引用offset-from-UTC一小时的小时数,例如-7,因为这是非标准的,并且与各种协议和库不兼容。始终使用零填充第二个数字,例如-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)等异常的规则,而不仅仅是从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

this code in action in 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

自纪元以来的数量

I strongly recommend against按时间按计数跟踪 - { - 3}}。但是如果有必要,你可以通过在epoch上调用Unix time方法来提取Joda-Time的内部毫秒 - 自纪元(getMillis,1970年第一时刻)。

请注意使用64位long而不是32位int DateTime

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

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

在Joda-Time。

long millis = DateTime.now( denverTimeZone ).getMillis();

答案 2 :(得分:11)

Calendar cal = Calendar.getInstance();
TimeZone tz = cal.getTimeZone();
Log.d("Time zone","="+tz.getDisplayName());

答案 3 :(得分:7)

试试这个:

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

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

答案 4 :(得分: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;
}

答案 5 :(得分:3)

是的,你可以。通过调用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;
}

答案 6 :(得分:1)

\cd Google\ Drive/

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

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

然后可以按照上面接受的答案获得时间

String[] ids=TimeZone.getAvailableIDs();

答案 7 :(得分:1)

我找到了一种更好,更简单的方法。

首先使用设置应用的时区

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

然后调用Calander内部获取日期,它使用上述整个应用程序设置的默认时区。

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

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

D / Los天使时间:2018年6月21日星期四13:52:25

答案 8 :(得分:0)

最简单的方法是使用SimpleDateFormat

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

或者您可以指定区域设置

答案 9 :(得分:0)

一种处理时区和毫秒值的方法:

val currentDateTime = Calendar.getInstance().apply {
        timeZone?.let {
            val tzCalendar = Calendar.getInstance(it)
            this.set(Calendar.HOUR_OF_DAY, tzCalendar.get(Calendar.HOUR_OF_DAY))
            this.set(Calendar.MINUTE, tzCalendar.get(Calendar.MINUTE))
        }
    }.time

这样,您可以获取特定时区的时间(以毫秒为单位)。