68

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

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

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

例如

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

乔达时间

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

14 回答 14

100

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

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

在 Java 8 中,您将使用java.time.ZonedDateTime.Java 8 等效于 Joda Time 的DateTime.

于 2009-08-20T10:53:04.890 回答
63

正如 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());
于 2009-08-20T11:12:32.103 回答
16

使用日历很简单:

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Europe/Madrid"));
Date currentDate = calendar.getTime();
于 2009-08-20T10:55:05.277 回答
15

使用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]
    }
于 2016-04-28T13:43:16.007 回答
2

你会为此使用JodaTime。Java.util.Date 在 TimeZone 方面非常有限。

于 2009-08-20T10:54:09.927 回答
2

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

    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); 
于 2012-03-20T07:13:14.017 回答
1

我无法使用日历让它工作。你必须使用 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());
于 2011-07-20T23:00:24.407 回答
1

java.time

java.util日期时间 API 及其格式化 API已SimpleDateFormat过时且容易出错。建议完全停止使用它们并切换到现代 Date-Time API *

另外,下面引用的是来自Joda-Time主页的通知:

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

使用java.time现代日期时间 API 的解决方案:如果您只想获取日期和时间(而不是时区信息),您可以使用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 工作level 仍然不符合 Java-8,请检查Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

于 2021-07-25T14:10:16.807 回答
1

你可以试试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]
于 2021-09-17T12:35:10.560 回答
0

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

Date date = new Date();
DateFormat df = new SimpleDateFormat("MM/dd/YYYY HH:mm a");
df.setTimeZone(TimeZone.getDefault());
df.format(date);
于 2021-01-06T16:16:13.067 回答
0

获取变量的日期。

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;
}
于 2021-10-28T06:15:23.050 回答
-1

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

现在日期 = 新日期();

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

 System.out.println("timeZone.......-->>>>>>"+df.format(now));  
于 2014-07-16T12:20:36.383 回答
-1

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));
于 2020-02-14T19:57:49.523 回答
-2
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
df.setTimeZone(TimeZone.getTimeZone("PST"));
final String dateTimeString = df.format(new Date());
于 2011-11-28T09:30:18.577 回答