当我创建一个新的Date
对象时,它被初始化为当前时间,但是在本地时区。 如何获取格林尼治标准时间的当前日期和时间?
#1楼
您可以直接使用
SimpleDateFormat dateFormatGmt = new SimpleDateFormat("dd:MM:yyyy HH:mm:ss");
dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(dateFormatGmt.format(new Date())+"");
#2楼
如果您希望Date对象的字段经过UTC调整,则可以使用Joda Time这样操作 :
import org.joda.time.DateTimeZone;
import java.util.Date;
...
Date local = new Date();
System.out.println("Local: " + local);
DateTimeZone zone = DateTimeZone.getDefault();
long utc = zone.convertLocalToUTC(local.getTime(), false);
System.out.println("UTC: " + new Date(utc));
#3楼
以下是获取GMT时间戳记对象的另一种建议:
import java.sql.Timestamp;
import java.util.Calendar;
...
private static Timestamp getGMT() {
Calendar cal = Calendar.getInstance();
return new Timestamp(cal.getTimeInMillis()
-cal.get(Calendar.ZONE_OFFSET)
-cal.get(Calendar.DST_OFFSET));
}
#4楼
只是为了简化操作,要在UTC
创建Date
,您可以使用Calendar
:
Calendar.getInstance(TimeZone.getTimeZone("UTC"));
它将使用“ UTC” TimeZone
为Calendar
构造一个新实例。
如果您需要该日历中的Date
对象,则可以使用getTime()
。
#5楼
乔恩·斯凯特(Jon Skeet)的回答似乎不正确。 他说:
java.util.Date
始终使用UTC。 是什么让您认为这是当地时间? 我怀疑问题在于您是通过使用本地时区的Calendar实例显示它,还是可能使用也使用本地时区的Date.toString()
来显示它。
但是,代码:
System.out.println(new java.util.Date().getHours() + " hours");
完全不使用Calendar
和SimpleDateFormat
给出本地时间,而不是GMT(UTC小时)。
这就是为什么似乎不正确的原因。
将响应汇总在一起,代码为:
System.out.println(Calendar.getInstance(TimeZone.getTimeZone("GMT"))
.get(Calendar.HOUR_OF_DAY) + " Hours");
显示的是GMT小时而不是本地时间-请注意,缺少getTime.getHours()
,因为这会创建一个Date()
对象,该对象理论上将日期存储在GMT中,但会返回本地时区中的小时数。
#6楼
这是获取String格式的GMT时间的另一种方法
String DATE_FORMAT = "EEE, dd MMM yyyy HH:mm:ss z" ;
final SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
String dateTimeString = sdf.format(new Date());
#7楼
简单地说。 日历对象存储有关时区的信息,但是当您执行cal.getTime()时,时区信息将丢失。 因此,对于时区转换,我建议使用DateFormat类...
#8楼
这对我有用,返回格林尼治标准时间的时间戳!
Date currDate;
SimpleDateFormat dateFormatGmt = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");
dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));
SimpleDateFormat dateFormatLocal = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");
long currTime = 0;
try {
currDate = dateFormatLocal.parse( dateFormatGmt.format(new Date()) );
currTime = currDate.getTime();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
#9楼
这适用于在Android中获取UTC毫秒。
Calendar c = Calendar.getInstance();
int utcOffset = c.get(Calendar.ZONE_OFFSET) + c.get(Calendar.DST_OFFSET);
Long utcMilliseconds = c.getTimeInMillis() + utcOffset;
#10楼
此代码显示当前时间UTC。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
public class Test
{
public static void main(final String[] args) throws ParseException
{
final SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
f.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(f.format(new Date()));
}
}
结果
2013-10-26 14:37:48 UTC
#11楼
tl; dr
Instant.now() // Capture the current moment in UTC.
生成一个字符串来表示该值:
Instant.now().toString()
2016-09-13T23:30:52.123Z
细节
正如乔恩·斯基特(Jon Skeet)的正确回答所指出的那样,java.util.Date对象没有时区 † 。 但是,它的toStr