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

Vis*_*shi 16 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();
}
Run Code Online (Sandbox Code Playgroud)

Vis*_*shi 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));
Run Code Online (Sandbox Code Playgroud)

  • 它返回设备时间,如果用户更改设备时间,我怎样才能从timeZone获得准确的时间 (4认同)

Bas*_*que 12

java.time

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

顺便说一句,永远不要用一个小时的数字来表示与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 );
Run Code Online (Sandbox Code Playgroud)

当前时间-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 );
Run Code Online (Sandbox Code Playgroud)

美国/丹佛当前时间: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 ();
Run Code Online (Sandbox Code Playgroud)

转储到控制台.

System.out.println ( "zone: " + zone + " | dateTime: " + dateTime + " | output: " + output );
Run Code Online (Sandbox Code Playgroud)

跑的时候......

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

自上世纪以来的数量

我强烈建议不要按时间跟踪count-since- epoch.但是如果有必要,你可以通过调用a上的方法来提取Joda-Time的内部毫秒 - 自纪元(Unix时间,1970年第一时刻).getMillisDateTime

请注意使用64位long而不是32位int 基元类型.

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

long millis = Instant.now ().toEpochMilli ();
Run Code Online (Sandbox Code Playgroud)

在Joda-Time.

long millis = DateTime.now( denverTimeZone ).getMillis();
Run Code Online (Sandbox Code Playgroud)

  • 如果设备(移动/系统)时间错误,以上方法均无效。如何以系统时间错误获取正确的时间? (2认同)

ara*_*ran 11

Calendar cal = Calendar.getInstance();
TimeZone tz = cal.getTimeZone();
Log.d("Time zone","="+tz.getDisplayName());
Run Code Online (Sandbox Code Playgroud)

  • 降票可能是由于没有解决问题.这些问题要求"在上述给定时区内获得当前时间".此答案不会引用此特定时区,也不会获取该区域的当前时间.相反,这个答案告诉我们JVM当前的默认时区.这与这个问题无关. (3认同)
  • 坏的downvote.超过+1取消,以恢复Androidverse的自然平衡. (2认同)

Flá*_*ria 7

试试这个:

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

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

  • 您应该按名称而不是三字母代码或偏移号来引用时区.3个字母的代码不是标准化的,而且很多都是重复的.如果使用名称而不是偏移量,则日期时间库可能会有助于夏令时和其他异常.请参阅[此列表](http://joda-time.sourceforge.net/timezones.html)的名称. (2认同)

小智 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;
}
Run Code Online (Sandbox Code Playgroud)


Tan*_*ith 5

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

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;
}
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

41240 次

最近记录:

6 年,6 月 前