我是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();
}
答案 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和第三方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
这样,您可以获取特定时区的时间(以毫秒为单位)。