如何获取当前日期和时间(UTC)或GMT(Java)?
当我创建一个新的如何获取当前日期和时间(UTC)或GMT(Java)?,java,date,localization,timezone,gmt,Java,Date,Localization,Timezone,Gmt,当我创建一个新的Date对象时,它被初始化为当前时间,但在本地时区。如何以GMT获取当前日期和时间?java.util.date没有特定的时区,尽管它的值通常被认为与UTC有关。你怎么会认为是在当地时间 准确地说:java.util.Date中的值是自Unix纪元(发生在UTC 1970年1月1日午夜)以来的毫秒数。同样的纪元也可以用其他时区来描述,但传统的描述是用UTC来描述的。由于这是一个固定纪元后的毫秒数,java.util.Date中的值在世界各地的任何特定时刻都是相同的,无论本地时区如
Date
对象时,它被初始化为当前时间,但在本地时区。如何以GMT获取当前日期和时间?java.util.date
没有特定的时区,尽管它的值通常被认为与UTC有关。你怎么会认为是在当地时间
准确地说:java.util.Date
中的值是自Unix纪元(发生在UTC 1970年1月1日午夜)以来的毫秒数。同样的纪元也可以用其他时区来描述,但传统的描述是用UTC来描述的。由于这是一个固定纪元后的毫秒数,java.util.Date
中的值在世界各地的任何特定时刻都是相同的,无论本地时区如何
Calendar c = Calendar.getInstance();
System.out.println("current: "+c.getTime());
TimeZone z = c.getTimeZone();
int offset = z.getRawOffset();
if(z.inDaylightTime(new Date())){
offset = offset + z.getDSTSavings();
}
int offsetHrs = offset / 1000 / 60 / 60;
int offsetMins = offset / 1000 / 60 % 60;
System.out.println("offset: " + offsetHrs);
System.out.println("offset: " + offsetMins);
c.add(Calendar.HOUR_OF_DAY, (-offsetHrs));
c.add(Calendar.MINUTE, (-offsetMins));
System.out.println("GMT Time: "+c.getTime());
DateTime now = DateTime.now( DateTimeZone.UTC );
我怀疑问题在于,您是通过使用本地时区的日历实例来显示它,或者可能使用同样使用本地时区的Date.toString()
,或者默认情况下同样使用本地时区的SimpleDataFormat
实例来显示它
如果这不是问题,请发布一些示例代码
但是,我建议您无论如何都要使用,因为它提供了更清晰的API。包括:
Calendar cal = Calendar.getInstance();
然后cal
有当前日期和时间。您还可以通过以下方式获取时区的当前日期和时间:
Calendar cal2 = Calendar.getInstance(TimeZone.getTimeZone("GMT-2"));
你可以问cal.get(Calendar.DATE)代码>或其他有关其他详细信息的日历常量。
Java中不推荐使用日期和时间戳。日历类它不是。您可以使用:
Calendar aGMTCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
然后,使用aGMTCalendar对象执行的所有操作都将使用GMT时区执行,并且不会应用夏令时或固定偏移。我认为前面的海报是正确的,Date()对象总是返回一个GMT,直到你对Date对象做一些事情,它才会转换为本地时区
Calendar c = Calendar.getInstance();
System.out.println("current: "+c.getTime());
TimeZone z = c.getTimeZone();
int offset = z.getRawOffset();
if(z.inDaylightTime(new Date())){
offset = offset + z.getDSTSavings();
}
int offsetHrs = offset / 1000 / 60 / 60;
int offsetMins = offset / 1000 / 60 % 60;
System.out.println("offset: " + offsetHrs);
System.out.println("offset: " + offsetMins);
c.add(Calendar.HOUR_OF_DAY, (-offsetHrs));
c.add(Calendar.MINUTE, (-offsetMins));
System.out.println("GMT Time: "+c.getTime());
DateTime now = DateTime.now( DateTimeZone.UTC );
Calendar aGMTCalendar=Calendar.getInstance(TimeZone.getTimeZone(“GMT”));
然后,使用aGMTCalendar对象执行的所有操作都将使用GMT时区执行,并且不会应用夏令时或固定偏移
错了
Calendar aGMTCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
aGMTCalendar.getTime(); //or getTimeInMillis()
及
将在同一时间返回。一念
new Date(); //it's not GMT.
实际上不是时间,但它的表示可以改变
SimpleDateFormat f = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");
f.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(f.format(new Date()));
地球上任何一点的时间都是一样的,但我们对时间的感知可能会因位置的不同而不同。这肯定会返回UTC时间:作为字符串和日期对象
SimpleDateFormat dateFormatGmt = new SimpleDateFormat("yyyy-MM-dd");
dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(dateFormatGmt.format(date));
static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
public static Date getUTCdatetimeAsDate() {
// note: doesn't check for null
return stringDateToDate(getUTCdatetimeAsString());
}
public static String getUTCdatetimeAsString() {
final SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
final String utcTime = sdf.format(new Date());
return utcTime;
}
public static Date stringDateToDate(String StrDate) {
Date dateToReturn = null;
SimpleDateFormat dateFormat = new SimpleDateFormat(DATEFORMAT);
try {
dateToReturn = (Date)dateFormat.parse(StrDate);
}
catch (ParseException e) {
e.printStackTrace();
}
return dateToReturn;
}
以特定时区和特定格式呈现系统时间的示例代码
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
public class TimZoneTest {
public static void main (String[] args){
//<GMT><+/-><hour>:<minutes>
// Any screw up in this format, timezone defaults to GMT QUIETLY. So test your format a few times.
System.out.println(my_time_in("GMT-5:00", "MM/dd/yyyy HH:mm:ss") );
System.out.println(my_time_in("GMT+5:30", "'at' HH:mm a z 'on' MM/dd/yyyy"));
System.out.println("---------------------------------------------");
// Alternate format
System.out.println(my_time_in("America/Los_Angeles", "'at' HH:mm a z 'on' MM/dd/yyyy") );
System.out.println(my_time_in("America/Buenos_Aires", "'at' HH:mm a z 'on' MM/dd/yyyy") );
}
public static String my_time_in(String target_time_zone, String format){
TimeZone tz = TimeZone.getTimeZone(target_time_zone);
Date date = Calendar.getInstance().getTime();
SimpleDateFormat date_format_gmt = new SimpleDateFormat(format);
date_format_gmt.setTimeZone(tz);
return date_format_gmt.format(date);
}
}
你可以直接使用这个
SimpleDateFormat dateFormatGmt = new SimpleDateFormat("dd:MM:yyyy HH:mm:ss");
dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(dateFormatGmt.format(new Date())+"");
如果您想要一个日期对象,该对象的字段根据UTC进行了调整,您可以通过以下方式完成:
下面是获取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));
}
为了简化此操作,要在UTC
中创建日期
,您可以使用:
它将使用“UTC”时区
为日历
构造一个新实例
如果您需要该日历中的Date
对象,您只需使用getTime()
以下是该日历中似乎不正确的内容。他说,
java.util.Date
始终以UTC为单位。你凭什么认为它是本地的
时间我怀疑问题在于您正在通过
使用本地时区的日历实例,或可能使用
Date.toString()
,它也使用本地时区
然而,守则:
System.out.println(new java.util.Date().getHours() + " hours");
给出本地小时数,而不是格林尼治标准时间(UTC小时),完全不使用日历和SimpleDataFormat
这就是为什么有些东西似乎是不正确的
将响应放在一起,代码:
System.out.println(Calendar.getInstance(TimeZone.getTimeZone("GMT"))
.get(Calendar.HOUR_OF_DAY) + " Hours");
显示GMT小时数而不是本地小时数--请注意,缺少getTime.getHours()
,因为这将创建一个Date()
对象,该对象理论上以GMT格式存储日期,但返回本地时区的小时数。以下是以字符串格式获取GMT时间的另一种方法
Calendar c = Calendar.getInstance();
System.out.println("current: "+c.getTime());
TimeZone z = c.getTimeZone();
int offset = z.getRawOffset();
if(z.inDaylightTime(new Date())){
offset = offset + z.getDSTSavings();
}
int offsetHrs = offset / 1000 / 60 / 60;
int offsetMins = offset / 1000 / 60 % 60;
System.out.println("offset: " + offsetHrs);
System.out.println("offset: " + offsetMins);
c.add(Calendar.HOUR_OF_DAY, (-offsetHrs));
c.add(Calendar.MINUTE, (-offsetMins));
System.out.println("GMT Time: "+c.getTime());
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());
DateTime now = DateTime.now( DateTimeZone.UTC );
简单地说。calendar对象存储有关时区的信息,但当执行cal.getTime()时,时区信息将丢失。因此,对于时区转换,我建议使用DateFormat类…这对我来说很有效,返回GMT格式的时间戳
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();
}
这适用于在Android中获取UTC毫秒
Calendar c = Calendar.getInstance();
int utcOffset = c.get(Calendar.ZONE_OFFSET) + c.get(Calendar.DST_OFFSET);
Long utcMilliseconds = c.getTimeInMillis() + utcOffset;
此代码打印当前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
tl;博士
生成表示该值的字符串:
Instant.now().toString()
2016-09-13T23:30:52.123Z
细节
如上所述,java.util.Date对象没有时区。但它的实现在生成该日期时间值的字符串表示时应用JVM的默认时区。让天真的程序员感到困惑的是,日期似乎有时区,但没有
与java捆绑在一起的java.util.Date
、j.u.Calendar
和java.text.SimpleDataFormat
类是出了名的麻烦避免使用它们。相反,请使用以下任一合适的日期时间库:
- Java8中的包
java.time(Java8)
带来了一个很好的新类来取代旧的java.util.Date/Calendar类
以UTC/GMT获取当前时间是一个简单的单行线
Instant Instant=Instant.now();
该类是java.time中的基本构建块,表示时间轴上的一个时刻,分辨率为
在Java8中,当前时刻的分辨率仅为毫秒。of捕获当前时刻的时间最长可达此类的纳秒级,具体取决于主机时钟硬件的能力
它的toString
方法使用生成其值的字符串表示。该格式根据需要输出零、三、六或九位数(、或),以表示-
Instant.now().toString()
OffsetDateTime now = OffsetDateTime.now( ZoneOffset.UTC );
DateTimeZone zoneMontréal = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( zoneMontréal );
DateTime now = DateTime.now( DateTimeZone.UTC );
DateTimeZone zoneDefault = DateTimeZone.getDefault();
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
class NTP_UTC_Time
{
private static final String TAG = "SntpClient";
private static final int RECEIVE_TIME_OFFSET = 32;
private static final int TRANSMIT_TIME_OFFSET = 40;
private static final int NTP_PACKET_SIZE = 48;
private static final int NTP_PORT = 123;
private static final int NTP_MODE_CLIENT = 3;
private static final int NTP_VERSION = 3;
// Number of seconds between Jan 1, 1900 and Jan 1, 1970
// 70 years plus 17 leap days
private static final long OFFSET_1900_TO_1970 = ((365L * 70L) + 17L) * 24L * 60L * 60L;
private long mNtpTime;
public boolean requestTime(String host, int timeout) {
try {
DatagramSocket socket = new DatagramSocket();
socket.setSoTimeout(timeout);
InetAddress address = InetAddress.getByName(host);
byte[] buffer = new byte[NTP_PACKET_SIZE];
DatagramPacket request = new DatagramPacket(buffer, buffer.length, address, NTP_PORT);
buffer[0] = NTP_MODE_CLIENT | (NTP_VERSION << 3);
writeTimeStamp(buffer, TRANSMIT_TIME_OFFSET);
socket.send(request);
// read the response
DatagramPacket response = new DatagramPacket(buffer, buffer.length);
socket.receive(response);
socket.close();
mNtpTime = readTimeStamp(buffer, RECEIVE_TIME_OFFSET);
} catch (Exception e) {
// if (Config.LOGD) Log.d(TAG, "request time failed: " + e);
return false;
}
return true;
}
public long getNtpTime() {
return mNtpTime;
}
/**
* Reads an unsigned 32 bit big endian number from the given offset in the buffer.
*/
private long read32(byte[] buffer, int offset) {
byte b0 = buffer[offset];
byte b1 = buffer[offset+1];
byte b2 = buffer[offset+2];
byte b3 = buffer[offset+3];
// convert signed bytes to unsigned values
int i0 = ((b0 & 0x80) == 0x80 ? (b0 & 0x7F) + 0x80 : b0);
int i1 = ((b1 & 0x80) == 0x80 ? (b1 & 0x7F) + 0x80 : b1);
int i2 = ((b2 & 0x80) == 0x80 ? (b2 & 0x7F) + 0x80 : b2);
int i3 = ((b3 & 0x80) == 0x80 ? (b3 & 0x7F) + 0x80 : b3);
return ((long)i0 << 24) + ((long)i1 << 16) + ((long)i2 << 8) + (long)i3;
}
/**
* Reads the NTP time stamp at the given offset in the buffer and returns
* it as a system time (milliseconds since January 1, 1970).
*/
private long readTimeStamp(byte[] buffer, int offset) {
long seconds = read32(buffer, offset);
long fraction = read32(buffer, offset + 4);
return ((seconds - OFFSET_1900_TO_1970) * 1000) + ((fraction * 1000L) / 0x100000000L);
}
/**
* Writes 0 as NTP starttime stamp in the buffer. --> Then NTP returns Time OFFSET since 1900
*/
private void writeTimeStamp(byte[] buffer, int offset) {
int ofs = offset++;
for (int i=ofs;i<(ofs+8);i++)
buffer[i] = (byte)(0);
}
}
long now = 0;
NTP_UTC_Time client = new NTP_UTC_Time();
if (client.requestTime("pool.ntp.org", 2000)) {
now = client.getNtpTime();
}
private String get_UTC_Datetime_from_timestamp(long timeStamp){
try{
Calendar cal = Calendar.getInstance();
TimeZone tz = cal.getTimeZone();
int tzt = tz.getOffset(System.currentTimeMillis());
timeStamp -= tzt;
// DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",Locale.getDefault());
DateFormat sdf = new SimpleDateFormat();
Date netDate = (new Date(timeStamp));
return sdf.format(netDate);
}
catch(Exception ex){
return "";
}
}
String UTC_DateTime = get_UTC_Datetime_from_timestamp(now);
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
DateTimeZone dateTimeZone = DateTimeZone.getDefault(); //Default Time Zone
DateTime currDateTime = new DateTime(); //Current DateTime
long utcTime = dateTimeZone.convertLocalToUTC(currDateTime .getMillis(), false);
String currTime = formatter.print(utcTime); //UTC time converted to string from long in format of formatter
currDateTime = formatter.parseDateTime(currTime); //Converted to DateTime in UTC
public static String GetCurrentTimeStamp()
{
Calendar cal=Calendar.getInstance();
long offset = cal.getTimeZone().getOffset(System.currentTimeMillis());//if you want in UTC else remove it .
return new java.sql.Timestamp(System.currentTimeMillis()+offset).toString();
}
long instant = DateTimeZone.UTC.getMillisKeepLocal(DateTimeZone.getDefault(), System.currentTimeMillis());
final Date gmt = new Timestamp(System.currentTimeMillis()
- Calendar.getInstance().getTimeZone()
.getOffset(System.currentTimeMillis()));
public static Date toUTC(Date date){
long datems = date.getTime();
long timezoneoffset = TimeZone.getDefault().getOffset(datems);
datems -= timezoneoffset;
return new Date(datems);
}
public static void main(String args[]){
LocalDate date=LocalDate.now();
System.out.println("Current date = "+date);
}
public class CurrentUtcDate
{
public static void main(String[] args) {
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println("UTC Time is: " + dateFormat.format(date));
}
}
UTC Time is: 22-01-2018 13:14:35
Instant.now().toString().replaceAll("T.*", "");