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

问题描述 投票:47回答:10

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

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

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

EG

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

With 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
10个回答
84
投票

Date总是基于UTC ...或时区中立,取决于您想要查看它的方式。 Date只代表一个时间点;它独立于时区,自Unix时代以来只有几毫秒。没有“当地Date实例”的概念。将DateCalendar和/或TimeZone.getDefault()结合使用可以使用“本地”时区。使用TimeZone.getTimeZone("Europe/Madrid")获取马德里时区。

...或使用Joda Time,这往往使整个事情更清晰,IMO。在Joda Time中,您将使用DateTime值,该值是特定日历系统和时区的即时时间。

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


-2
投票
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
df.setTimeZone(TimeZone.getTimeZone("PST"));
final String dateTimeString = df.format(new Date());

49
投票

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

16
投票

使用Calendar很简单:

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

9
投票

使用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]
    }

3
投票

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

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

2
投票

你会使用JodaTime。关于TimeZone,Java.util.Date非常有限。


1
投票

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

0
投票

这是一个例子:

Calendar c = Calendar.getInstance(TimeZone.getDefault());
Date date = c.getTime();

0
投票

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

现在日期=新日期();

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

 System.out.println("timeZone.......-->>>>>>"+df.format(now));  
© www.soinside.com 2019 - 2024. All rights reserved.