如何在 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...或时区中立,具体取决于您如何查看它。 Date
only 代表一个时间点;它与时区无关,距 Unix 纪元仅几毫秒。没有“Date
的本地实例”的概念。将Date
与Calendar
和/或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 中获取时区的当前日期和时间?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Python 中获取或打印 GMT 时区的当前日期时间? [复制]