20

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

11 回答 11

23

我让它像这样工作:

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

此外,基于此日期的所有其他时间转换也应与此时区一起使用,否则将使用设备的默认时区,并且将基于该时区转换时间。

于 2013-04-24T23:34:56.467 回答
13
// Backup the system's timezone
TimeZone backup = TimeZone.getDefault();

String timezoneS = "GMT-1";
TimeZone tz = TimeZone.getTimeZone(timezoneS);
TimeZone.setDefault(tz);
// Now onwards, the default timezone will be GMT-1 until changed again

Calendar cal = Calendar.getInstance();
Date date = cal.getTime();
String timeS = String.format("Your time on %s:%s", timezoneS, date);
System.out.println(timeS);

// Restore the original timezone
TimeZone.setDefault(backup);
System.out.println(new Date());
于 2013-04-24T22:03:50.800 回答
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 );

当前时间在-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

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

运行时……</p>

地区:美国/丹佛 | 日期时间:2016-07-11T20:50:17.668-06:00 | 输出:20:50:17.668

从纪元开始计数

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

请注意使用 64 位long而不是 32 位int 原始类型

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

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

在乔达时代。

long millis = DateTime.now( denverTimeZone ).getMillis();
于 2013-11-28T05:04:55.973 回答
9

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

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;
}
于 2015-05-13T10:00:57.170 回答
8

尝试这个:

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

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

于 2013-04-24T22:01:39.530 回答
4

是的你可以。通过调用 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;
}
于 2017-03-24T03:54:38.887 回答
2

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

应用程序的第一个设置时区使用

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

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

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

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

D/洛杉矶时间:2018 年 6 月 21 日星期四 13:52:25 PDT

于 2018-06-21T17:25:56.160 回答
1

在科特林:

 val mTime: Calendar = Calendar.getInstance()
 val timeZone = TimeZone.getDefault().displayName // based on the device time zone it will calculate.

输出 :

IST // it will return device time zone
于 2021-10-19T18:46:01.550 回答
1
 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));
于 2018-01-31T04:55:57.643 回答
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

这样,您就可以获得特定时区的毫秒数。

于 2020-01-30T10:35:23.293 回答
0

最干净的方法是使用 SimpleDateFormat

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

或者您可以指定语言环境

于 2018-06-21T21:00:24.110 回答