【问题标题】:How to get the current date and time of your timezone in Java?如何在 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();

【问题讨论】:

标签: java timezone jodatime


【解决方案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 desugaringHow 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());
          

          【讨论】:

          • @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)
          • 请阅读 stackoverflow.com/faq 的 stackoverflow 常见问题解答:“没有问题太琐碎或太“新手”。哦,是的,应该是关于编程的。”
          • 常见问题解答是正确的。如果有人用 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。
          猜你喜欢
          • 2014-09-08
          • 2023-01-30
          • 2011-01-01
          • 1970-01-01
          • 2015-08-16
          • 2010-09-23
          • 2010-10-03
          • 2019-08-13
          • 2017-10-05
          相关资源
          最近更新 更多