如何在 Java 中获取时区的当前日期和时间?

Posted

技术标签:

【中文标题】如何在 Java 中获取时区的当前日期和时间?【英文标题】:How to get the current date and time of your timezone in Java? 【发布时间】:2010-11-21 06:41:33 【问题描述】:

我的应用托管在伦敦服务器上。我在西班牙马德里。所以时区是-2小时。

如何使用我的时区获取当前日期/时间。

Date curr_date = new Date(System.currentTimeMillis());

例如

Date curr_date = new Date(System.currentTimeMillis("MAD_TIMEZONE"));

与Joda-Time

DateTimeZone zone = DateTimeZone.forID("Europe/Madrid");
DateTime dt = new DateTime(zone);
int day = dt.getDayOfMonth();
int year = dt.getYear();
int month = dt.getMonthOfYear();
int hours = dt.getHourOfDay();
int minutes = dt.getMinuteOfHour();

【问题讨论】:

How can I get the current date and time in UTC or GMT in Java?的可能重复 例如代码使用 Joda-Time 在时区之间进行转换,请参阅问题my answerJava Convert GMT/UTC to Local time doesn't work as expected 【参考方案1】:

获取日期到变量。

public static  String  getCurrentDate()
    final ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Asia/Kolkata"));
    String Temporal= DateTimeFormatter.ofPattern("yyyy-MM-dd").format(now);
    String today= LocalDate.now().format(DateTimeFormatter.ofPattern(Temporal));
    return today;

【讨论】:

【参考方案2】:

你可以试试ZonedDateTime.now()。你可以在包 java.time 中找到它

import java.time.ZonedDateTime;

public class Temp 
public static void main(String args[]) 
    System.out.println(ZonedDateTime.now(ZoneId.of("Europe/Madrid")));

输出(我在印度加尔各答):

2021-09-17T14:46:14.341+02:00[Europe/Madrid]

【讨论】:

【参考方案3】:

java.time

java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用,改用modern Date-Time API*

另外,下面引用的是来自home page of Joda-Time的通知:

请注意,从 Java SE 8 开始,用户被要求迁移到 java.time (JSR-310) - JDK 的核心部分,它取代了这个项目。

使用现代日期时间 API java.time 的解决方案:如果您只想获取日期和时间(而不是时区信息),可以使用 LocalDateTime.#now(ZoneId)

非参数化重载,LocalDateTime.#now 使用 JVM 的时区返回当前日期时间。相当于使用LocalDateTime.now(ZoneId.systemDefault())

演示:

import java.time.LocalDateTime;
import java.time.ZoneId;

public class Main 
    public static void main(String[] args) 
        LocalDateTime now = LocalDateTime.now(ZoneId.of("Europe/Madrid"));
        System.out.println(now);
    

样本运行的输出:

2021-07-25T15:54:31.574424

ONLINE DEMO

如果您想获取日期和时间以及时区信息,可以使用ZonedDateTime.#now(ZoneId)。它的非参数化变体的行为方式与上述相同。

演示:

import java.time.ZoneId;
import java.time.ZonedDateTime;

public class Main 
    public static void main(String[] args) 
        ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Europe/Madrid"));
        System.out.println(now);
    

样本运行的输出:

2021-07-25T16:08:54.741773+02:00[Europe/Madrid]

ONLINE DEMO

Trail: Date Time 了解有关现代日期时间 API 的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。

【讨论】:

【参考方案4】:

获取您所在区域的日期和时间。

Date date = new Date();
DateFormat df = new SimpleDateFormat("MM/dd/YYYY HH:mm a");
df.setTimeZone(TimeZone.getDefault());
df.format(date);

【讨论】:

这是现有答案的副本。【参考方案5】:

24 小时制日期

输出:14/02/2020 19:56:49 PM

 Date date = new Date();
 DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss aa");
 dateFormat.setTimeZone(TimeZone.getTimeZone("Europe/London"));
 System.out.println("date is: "+dateFormat.format(date));

12 小时格式的日期

输出:14/02/2020 07:57:11 PM

 Date date = new Date();`enter code here`
 DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss aa");
 dateFormat.setTimeZone(TimeZone.getTimeZone("Europe/London"));
 System.out.println("date is: "+dateFormat.format(date));

【讨论】:

他说西班牙马德里 @mmm 他可以随心所欲地替换变量... 这是现有答案的副本。【参考方案6】:

检查这可能会有所帮助。对我来说很好。代码还涵盖了夏令时

    TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai");
    Calendar cal = Calendar.getInstance();      
    // If needed in hours rather than milliseconds
    int LocalOffSethrs = (int) ((cal.getTimeZone().getRawOffset()) *(2.77777778 /10000000));        
    int ChinaOffSethrs = (int) ((tz.getRawOffset()) *(2.77777778 /10000000));       
    int dts = cal.getTimeZone().getDSTSavings();
    System.out.println("Local Time Zone : " + cal.getTimeZone().getDisplayName());
    System.out.println("Local Day Light Time Saving : " + dts);
    System.out.println("China Time : " + tz.getRawOffset());
    System.out.println("Local Offset Time from GMT: " + LocalOffSethrs);
    System.out.println("China Offset Time from GMT: " + ChinaOffSethrs);    
    // Adjust to GMT
    cal.add(Calendar.MILLISECOND,-(cal.getTimeZone().getRawOffset()));  
    // Adjust to Daylight Savings
    cal.add(Calendar.MILLISECOND, - cal.getTimeZone().getDSTSavings());
    // Adjust to Offset
    cal.add(Calendar.MILLISECOND, tz.getRawOffset());       
    Date dt = new Date(cal.getTimeInMillis());              
    System.out.println("After adjusting offset Acctual China Time :" + dt); 

【讨论】:

很好的例子,但用我的时区 (EST) 尝试它不会返回正确的值。使用 RawOffset 不考虑 DST。所以我提前 1 小时结束。 通过添加/减去持续时间“转换”到另一个时区确实会让您陷入大量问题。要转换到另一个时区,您应该为新时区创建一个新的日历对象,为其设置日期,然后使用get(int) 方法获取该时区的时间值。【参考方案7】:

使用 Java 8 及更高版本中内置的 java.time 类:

public static void main(String[] args) 
        LocalDateTime localNow = LocalDateTime.now(TimeZone.getTimeZone("Europe/Madrid").toZoneId());
        System.out.println(localNow);
        // Prints current time of given zone without zone information : 2016-04-28T15:41:17.611
        ZonedDateTime zoneNow = ZonedDateTime.now(TimeZone.getTimeZone("Europe/Madrid").toZoneId());
        System.out.println(zoneNow);
        // Prints current time of given zone with zone information : 2016-04-28T15:41:17.627+02:00[Europe/Madrid]
    

【讨论】:

【参考方案8】:

Date总是基于 UTC...或时区中立,具体取决于您如何查看它。 Dateonly 代表一个时间点;它与时区无关,距 Unix 纪元仅几毫秒。没有“Date 的本地实例”的概念。将DateCalendar 和/或TimeZone.getDefault() 结合使用以使用“本地”时区。使用TimeZone.getTimeZone("Europe/Madrid") 获取马德里时区。

...或使用Joda Time,这会使整个事情变得更清晰,IMO。在 Joda Time 中,您将使用 DateTime 值,它是在特定日历系统和时区中的一个瞬间

在 Java 8 中,您将使用 java.time.ZonedDateTime,这是 Java 8 中 Joda Time 的 DateTime 的等价物。

【讨论】:

Date currentDate = Calendar.getInstance(TimeZone.getDefault()).getTime() @user3132194:你认为这对new Date()有什么好处? 这只是一个复制粘贴的模板,根据您的回答。你说Date is always UTC-based。我需要当地时间。 @user3132194:这是一个复制和粘贴的可怕模板。 new Date() 没有任何好处。如果你想要一个当地时间,你不应该使用Date。如果你认为你的代码比new Date() 做了一些有用的事情,我怀疑你误解了。 你是对的 new Date()java.util.Calendar.getInstance(java.util.TimeZone.getDefault()).getTime() 甚至 java.util.Calendar.getInstance(java.util.TimeZone.getTimeZone("Europe/Madrid")).getTime() 也一样。但不幸的是,你的答案是错误的。或者你能给我一个好的模板吗?似乎只有 Jesper 的答案是正确的。【参考方案9】:

以下是为您的区域寻找时间的一些步骤:

现在日期 = new Date();

 DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");  
 df.setTimeZone(TimeZone.getTimeZone("Europe/London"));  

 System.out.println("timeZone.......-->>>>>>"+df.format(now));  

【讨论】:

这个答案不仅重复one posted years ago,而且缺乏任何有用的解释。我建议撤回这个答案。【参考方案10】:
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
df.setTimeZone(TimeZone.getTimeZone("PST"));
final String dateTimeString = df.format(new Date());

【讨论】:

现有答案的副本,没有解释。【参考方案11】:

我无法使用日历让它工作。你必须使用 DateFormat

//Wednesday, July 20, 2011 3:54:44 PM PDT
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
df.setTimeZone(TimeZone.getTimeZone("PST"));
final String dateTimeString = df.format(new Date());

//Wednesday, July 20, 2011
df = DateFormat.getDateInstance(DateFormat.FULL);
df.setTimeZone(TimeZone.getTimeZone("PST"));
final String dateString = df.format(new Date());

//3:54:44 PM PDT
df = DateFormat.getTimeInstance(DateFormat.FULL);
df.setTimeZone(Timezone.getTimeZone("PST"));
final String timeString = df.format(new Date());

【讨论】:

如果您需要将日期/时间作为字符串,DateFormat 是一种不错的方法。如果您需要将值作为数字,请使用日历。【参考方案12】:

正如 Jon Skeet 所说,java.util.Date 没有时区。 Date 对象表示自 1970 年 1 月 1 日凌晨 12:00 UTC 以来的毫秒数。它不包含时区信息。

当您将 Date 对象格式化为字符串时,例如使用SimpleDateFormat,您可以在DateFormat 对象上设置时区,让它知道您要在哪个时区显示日期和时间:

Date date = new Date();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

// Use Madrid's time zone to format the date in
df.setTimeZone(TimeZone.getTimeZone("Europe/Madrid"));

System.out.println("Date and time in Madrid: " + df.format(date));

如果您想要运行程序的计算机的本地时区,请使用:

df.setTimeZone(TimeZone.getDefault());

【讨论】:

它似乎在:mkyong.com/java8/java-display-all-zoneid-and-its-utc-offset @mmm 我写的是 java.util.Date 对象不包含时区信息。这并不意味着 Java 通常不知道时区 - 正如您所发现的那样,确实如此。您链接到的示例仅打印 Java 知道的时区,这与 java.util.Date 类没有任何关系。该示例甚至根本没有使用该类。 我只是说 TimeZone.getTimeZone("") 需要一个字符串,并且在链接之前没有证据表明您提供的传递的字符串是有效的,因为 Java df.setTimezone 不会导致根据文档出错。【参考方案13】:

使用Calendar 很简单:

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Europe/Madrid"));
Date currentDate = calendar.getTime();

【讨论】:

“GMT-2”不会给出“始终为 GMT-2”的区域,其中不包括夏令时吗? 你说得对,我正在寻找用于处理夏令时的时区表(我不确定 -2) 请阅读 ***.com/faq 的 *** 常见问题解答:“没有问题太琐碎或太“新手”。哦,是的,应该是关于编程的。” 常见问题解答是正确的。如果有人用 Google 搜索 任何 编程问题,我们希望 Stack Overflow 成为热门搜索结果(或非常接近)。这意味着即使是最微不足道的问题,如果它不存在于 SO 上,也是公平的游戏。 即使您为日历实例设置了时区,getTime() 方法也不会考虑它。来自其 javadocs:Returns a Date object representing this Calendar's time value (millisecond offset from the Epoch").【参考方案14】:

你可以使用JodaTime。 Java.util.Date 在 TimeZone 方面非常有限。

【讨论】:

java.util.Date 故意与 TimeZone 分离。对于简单的“特定时区的时间是多少”,java.util.* 并不算太糟糕......但我同意 Joda Time 只是一个更好的 API。

以上是关于如何在 Java 中获取时区的当前日期和时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中获取另一个时区的当前日期和时间?

如何在 Python 中获取或打印 GMT 时区的当前日期时间? [复制]

如何在javascript中获取时区的当前日期

获取时区的当前日期对象[重复]

如何在 Dynamics CRM 中获取时区的夏令时开始和结束?

Calendar日期类详解SimpleDateFormat时区Date夏令时常用方法,日期差获取当前时间