300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 如何使用Java中的UTC或GMT获取当前日期和时间?

如何使用Java中的UTC或GMT获取当前日期和时间?

时间:2024-05-26 03:14:34

相关推荐

如何使用Java中的UTC或GMT获取当前日期和时间?

当我创建一个新的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”TimeZoneCalendar构造一个新实例。

如果您需要该日历中的Date对象,则可以使用getTime()

#5楼

乔恩·斯凯特(Jon Skeet)的回答似乎不正确。 他说:

java.util.Date始终使用UTC。 是什么让您认为这是当地时间? 我怀疑问题在于您是通过使用本地时区的Calendar实例显示它,还是可能使用也使用本地时区的Date.toString()来显示它。

但是,代码:

System.out.println(new java.util.Date().getHours() + " hours");

完全不使用CalendarSimpleDateFormat给出本地时间,而不是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 blocke.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()));}}

结果

-10-26 14:37:48 UTC

#11楼

tl; dr

Instant.now() // Capture the current moment in UTC.

生成一个字符串来表示该值:

Instant.now().toString()

-09-13T23:30:52.123Z

细节

正如乔恩·斯基特(Jon Skeet)的正确回答所指出的那样,java.util.Date对象没有时区† 。 但是,它的toString实现在生成该日期时间值的String表示形式时将应用JVM的默认时区。 令天真的程序员感到困惑的是,“日期”似乎有一个时区,但没有。

与Java捆绑在一起的java.util.DatejuCalendarjava.text.SimpleDateFormat类非常麻烦。避免他们。而是使用以下任何一种合格的日期时间库:

Java 8中的java.time。*软件包 乔达时代

java.time(Java 8)

Java 8带来了一个出色的新java.time。*包,以取代旧的java.util.Date/Calendar类。

在UTC / GMT中获取当前时间是一个简单的方法。

Instant instant = Instant.now();

Instant类是java.time基本构建块,代表时间线上的时刻UTC ,分辨率为纳秒 。

在Java 8中,当前时刻只能以毫秒级的分辨率捕获。 Java 9带来了全新的Clock实现 ,具体取决于您主机时钟硬件的能力,以此类的完整纳秒能力捕获当前时刻。

它的toString方法使用一种特定的ISO 8601格式生成其值的String表示形式 。 该格式根据需要输出零,三,六或九位数字( 毫秒 , 微秒或纳秒 )来表示秒的分数。

如果您想要更灵活的格式设置或其他附加功能,则对UTC本身(UTC 常量 ,ZoneOffset.UTC常数 )应用UTC偏移量为零以获得OffsetDateTime

OffsetDateTime now = OffsetDateTime.now( ZoneOffset.UTC );

转储到控制台...

System.out.println( "now: " + now );

运行时...

now: -01-21T23:42:03.522Z

关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧的旧式日期时间类,例如java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参见Oracle教程。 并在Stack Overflow中搜索许多示例和说明。 规格为JSR 310 。

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

您可以直接与数据库交换java.time对象。 使用与JDBC 4.2或更高版本兼容的JDBC驱动程序 。 不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

Java SE 8Java SE 9Java SE 10Java SE 11和更高版本-标准Java API的一部分,具有捆绑的实现。 Java 9添加了一些次要功能和修复。Java SE 6Java SE 7大多数java.time功能都在ThreeTen-Backport中反向移植到Java 6和7。安卓系统更高版本的Android捆绑了java.time类的实现。 对于早期的Android(<26),ThreeTenABP项目改编了ThreeTen-Backport(如上所述)。 请参阅如何使用ThreeTenABP…。

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目为将来可能在java.time中添加内容提供了一个试验场。 您可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多 。

乔达时代

更新:现在处于维护模式的Joda-Time项目建议迁移到java.time类。

使用Joda-Time 3rd-party开源免费库,您只需一行代码即可获取当前日期时间。

Joda-Time启发了Java 8中新的java.time。*类,但具有不同的体系结构。 您可以在Java的旧版本中使用Joda-Time。 Joda-Time继续在Java 8中工作,并继续得到积极维护(截至)。 但是,Joda-Time团队确实建议迁移到java.time。

System.out.println( "UTC/GMT date-time in ISO 8601 format: " + new org.joda.time.DateTime( org.joda.time.DateTimeZone.UTC ) );

更详细的示例代码(Joda-Time 2.3)…

org.joda.time.DateTime now = new org.joda.time.DateTime(); // Default time .joda.time.DateTime zulu = now.toDateTime( org.joda.time.DateTimeZone.UTC );

转储到控制台...

System.out.println( "Local time in ISO 8601 format: " + now );System.out.println( "Same moment in UTC (Zulu): " + zulu );

运行时...

Local time in ISO 8601 format: -01-21T15:34:29.933-08:00Same moment in UTC (Zulu): -01-21T23:34:29.933Z

有关进行时区工作的更多示例代码,请参见我对类似问题的回答。

时区

我建议您始终指定一个时区,而不是隐式依赖JVM的当前默认时区(该时区随时可能更改!)。 这种依赖似乎是造成日期时间工作混乱和错误的常见原因。

调用now()传递要分配的期望/期望的时区。 使用DateTimeZone类。

DateTimeZone zoneMontréal = DateTimeZone.forID( "America/Montreal" );DateTime now = DateTime.now( zoneMontréal );

该类在UTC时区保持不变 。

DateTime now = DateTime.now( DateTimeZone.UTC );

如果您确实要使用JVM的当前默认时区,请进行显式调用,以使您的代码可以自我记录。

DateTimeZone zoneDefault = DateTimeZone.getDefault();

ISO 8601

阅读有关ISO 8601格式的信息。 java.time和Joda-Time都使用该标准的合理格式作为解析和生成字符串的默认值。

†实际上,java.util.Date确实有一个时区,埋在源代码层的深处。 对于大多数实际目的,该时区将被忽略。 因此,作为简写,我们说java.util.Date没有时区。 此外,该隐式时区不是Date的toString方法使用的时区。 该方法使用JVM的当前默认时区。 还有更多的理由避免这种令人困惑的类,并坚持使用Joda-Time和java.time。

#12楼

使用此类可以从在线NTP服务器获得正确的UTC时间:

import .DatagramPacket;import .DatagramSocket;import .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 daysprivate 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 responseDatagramPacket 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 valuesint 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("", 2000)) { now = client.getNtpTime();}

如果您需要UTC时间“ now”作为DateTimeString,请使用以下函数:

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

#13楼

以UTC转换当前日期时间:

DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");DateTimeZone dateTimeZone = DateTimeZone.getDefault(); //Default Time ZoneDateTime currDateTime = new DateTime(); //Current DateTimelong utcTime = dateTimeZone.convertLocalToUTC(currDateTime .getMillis(), false);String currTime = formatter.print(utcTime); //UTC time converted to string from long in format of formattercurrDateTime = formatter.parseDateTime(currTime); //Converted to DateTime in UTC

#14楼

您可以使用:

Calendar aGMTCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));

然后,使用aGMTCalendar对象执行的所有操作都将在GMT时区完成,并且不会应用夏令时或固定的偏移量。 我认为上一个发布者是正确的,Date()对象始终返回GMT,直到您对将其转换为本地时区的date对象执行操作之前,它不会。

#15楼

这是我的实现:

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

#16楼

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

#17楼

SimpleDateFormat dateFormatGmt = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));//Local time zone SimpleDateFormat dateFormatLocal = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");//Time in GMTreturn dateFormatLocal.parse( dateFormatGmt.format(new Date()) );

#18楼

日历aGMTCalendar = Calendar.getInstance(TimeZone.getTimeZone(“ GMT”)); 然后,使用aGMTCalendar对象执行的所有操作都将在GMT时区完成,并且不会应用夏时制或应用固定的偏移量

错误!

Calendar aGMTCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));aGMTCalendar.getTime(); //or getTimeInMillis()

Calendar aNotGMTCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT-2"));aNotGMTCalendar.getTime();

将在同一时间返回。 同上

new Date(); //it's not GMT.

#19楼

尽管java.util.Date的值通常与UTC有关,但没有特定的时区。 是什么让您认为这是当地时间?

准确地说:java.util.Date的值是自Unix纪元以来的毫秒数,该纪元发生在UTC的1970年1月1日午夜。 相同的纪元也可以在其他时区进行描述,但是传统的描述是以UTC表示的。 由于距固定纪元以来已有毫秒数,因此java.util.Date的值在世界各地在任何特定时刻都是相同的,而与本地时区无关。

我怀疑问题在于您是通过使用本地时区的Calendar实例显示它,还是使用也使用本地时区的Date.toString()SimpleDateFormat实例(默认情况下也使用本地)来显示它时区。

如果这不是问题,请发布一些示例代码。

但是,无论如何,我还是建议您使用Joda-Time ,它提供了更加清晰的API。

#20楼

带有:

Calendar cal = Calendar.getInstance();

然后cal具有当前日期和时间。

您还可以通过以下方式获取时区的当前日期和时间:

Calendar cal2 = Calendar.getInstance(TimeZone.getTimeZone("GMT-2"));

您可以询问cal.get(Calendar.DATE);或其他有关其他详细信息的日历常量。

日期和时间戳在Java中已弃用。 日历类不是。

#21楼

如果您使用的是joda时间,并且想要以毫秒为单位的当前时间而不需要本地偏移,则可以使用以下命令:

long instant = DateTimeZone.UTC.getMillisKeepLocal(DateTimeZone.getDefault(), System.currentTimeMillis());

#22楼

如果要避免解析日期,而只需要GMT中的时间戳,则可以使用:

final Date gmt = new Timestamp(System.currentTimeMillis()- Calendar.getInstance().getTimeZone().getOffset(System.currentTimeMillis()));

#23楼

这是我对toUTC的实现:

public static Date toUTC(Date date){long datems = date.getTime();long timezoneoffset = TimeZone.getDefault().getOffset(datems);datems -= timezoneoffset;return new Date(datems);}

可能有几种方法可以改善它,但对我有用。

#24楼

public static void main(String args[]){LocalDate date=LocalDate.now(); System.out.println("Current date = "+date);}

#25楼

实际上不是时间,但是它的表示形式可以更改。

SimpleDateFormat f = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");f.setTimeZone(TimeZone.getTimeZone("UTC"));System.out.println(f.format(new Date()));

在地球的任何一点上,时间都是相同的,但是根据位置的不同,我们对时间的理解可能会有所不同。

#26楼

SimpleDateFormat dateFormatGmt = new SimpleDateFormat("yyyy-MM-dd");dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));System.out.println(dateFormatGmt.format(date));

#27楼

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- 13:14:35

您可以根据需要更改日期格式。

#28楼

使用java.time包,并包含以下代码-

ZonedDateTime now = ZonedDateTime.now( ZoneOffset.UTC );

要么

LocalDateTime now2 = LocalDateTime.now( ZoneOffset.UTC );

取决于您的应用程序需求。

#29楼

这肯定会返回UTC时间:作为String和Date对象!

static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";public static Date getUTCdatetimeAsDate() {// note: doesn't check for nullreturn 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;}

#30楼

用于以特定时区和特定格式呈现系统时间的示例代码。

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

输出量

10/08/ 21:07:21at 07:37 AM GMT+05:30 on 10/09/at 19:07 PM PDT on 10/08/at 23:07 PM ART on 10/08/

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。