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

如何在Java中获取时区的当前日期和时间?,java,timezone,jodatime,Java,Timezone,Jodatime,我的应用程序托管在伦敦的服务器上。我在西班牙马德里。所以时区是-2小时 如何使用时区获取当前日期/时间 Date curr_date = new Date(System.currentTimeMillis()); e、 g 具有 始终基于UTC。。。或时区中立,取决于您想如何查看它。日期只代表一个时间点;它与时区无关,自Unix时代以来只有毫秒数。没有“日期的本地实例”的概念。请结合使用和/或使用“本地”时区。使用TimeZone.getTimeZone(“欧洲/马德里”)获取马德里时区 Da

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

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

Date curr_date = new Date(System.currentTimeMillis());
e、 g

具有 始终基于UTC。。。或时区中立,取决于您想如何查看它。日期只代表一个时间点;它与时区无关,自Unix时代以来只有毫秒数。没有“日期的本地实例”的概念。请结合使用和/或使用“本地”时区。使用
TimeZone.getTimeZone(“欧洲/马德里”)
获取马德里时区

Date curr_date = new Date(System.currentTimeMillis());
。。。或者使用,在我看来,这会使整个事情变得更清楚。在Joda Time中,你会使用一个
DateTime
值,它是特定日历系统和时区中的一个瞬间

Date curr_date = new Date(System.currentTimeMillis());
在Java8中,您将使用
Java.time.ZonedDateTime
,这是Java8中您将使用的Joda time的
DateTime

。Java.util.Date在时区方面非常有限。

使用非常简单:

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

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

将日期对象格式化为字符串时,例如通过使用
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());

我无法使用日历使其工作。你必须使用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());

检查此选项可能会有所帮助。对我来说很好。该守则还包括夏令时

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

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

现在日期=新日期()

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

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

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


java.util.Date故意与时区分离。对于简单的“特定时区的时间是多少”java.util.*还不错。。。但是我同意Joda Time是一个更好的API。难道“GMT-2”不会给出“always GMT-2”区域吗?它不包括夏令时?你是对的,我正在寻找一个处理夏令时的时区表(我不确定-2)。请阅读stackoverflow常见问题解答:“没有问题太琐碎或太”新手“哦,是的,它应该是关于编程的。”常见问题解答是正确的。如果有人用谷歌搜索任何编程问题,我们希望堆栈溢出成为最热门的搜索结果(或非常接近它)。这意味着即使是最简单的问题,如果它不存在的话,也是公平的。即使您为日历实例设置了时区,
getTime()
方法也不会考虑它。从其javadocs:
返回表示此日历时间值的日期对象(从历元的毫秒偏移量).
使用Joda Time在时区之间转换的示例代码的可能重复,请参见问题的“尼斯示例”,但使用my timezone(EST)尝试该示例不会返回正确的值。与RoWOffice一起工作并不考虑DST。因此,我提前1小时结束。通过增加/减少时间持续时间,将“转换”到另一个时区会让你陷入一大堆问题。要转换到另一个时区,您应该为新时区创建一个新的日历对象,设置日期,然后使用
get(int)
方法获取该时区的时间值。这个答案不仅重复,而且缺少任何有用的解释。我建议收回这个答案。
Date currentDate=Calendar.getInstance(TimeZone.getDefault()).getTime()
@user3132194:你认为这对
new Date()
有什么好处?它只是一个复制粘贴的模板,基于你的答案。您说过,
日期始终基于UTC
。我需要当地时间。@user3132194:这是一个很难复制和粘贴的模板。
newdate()
没有任何好处。如果你想要一个当地时间,你不应该使用
Date
。如果您认为您的代码在新日期上做了一些有用的事情,我怀疑您误解了。您是对的,新日期、java.util.Calendar.getInstance(java.util.TimeZone.getDefault()).getTime()甚至
java.util.Calendar.getInstance(java.util.TimeZone.getTimeZone(“欧洲/马德里”)).getTime()
工作原理相同。但不幸的是,你的答案是错误的。或者你能给我看一个好的模板吗?看来只有杰斯珀的答案是正确的madrid@mmm他可以随心所欲地替换变量……这是一个现有答案的副本。它似乎在:@mmm我写的是一个
java.util.Date
对象不包含时区信息。这并不意味着Java一般不知道时区——正如您所发现的,确实如此。您链接到的示例只打印Java知道的时区,这与类
Java.util.Date
无关。该示例甚至根本没有使用该类。我只是说TimeZone.getTimeZone(“”)接受一个字符串,并且在链接之前没有证据表明您提供的传递字符串作为Java df有效。根据文档,setTimezone不会导致错误。如果您需要将日期/时间作为字符串,DateFormat是一种很好的方法。如果您需要数值,请使用日历。这是现有答案的副本。现有答案的副本,无需解释。
 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));
Date date = new Date();
DateFormat df = new SimpleDateFormat("MM/dd/YYYY HH:mm a");
df.setTimeZone(TimeZone.getDefault());
df.format(date);