我在MST,我希望我的日期在太平洋标准时间。我设置了我想要的时区。
现在如果我做c.getTime()
我总是得到我的服务器时间。
相反,我想要太平洋日期时间。请帮忙
如何在指定的时区中获取日期时间对象。
Calendar c= Calendar.getInstance();
TimeZone timezone= TimeZone.getTimeZone("PST");
c.setTimeZone(timezone)
答案 0 :(得分:2)
或者,使用JodaTime
@Grab( 'joda-time:joda-time:2.3' )
import org.joda.time.*
def now = new DateTime()
println now.withZone( DateTimeZone.forTimeZone( TimeZone.getTimeZone( "PST" ) ) )
答案 1 :(得分:2)
TimeZone.setDefault(TimeZone.getTimeZone('PST'))
println new Date() //PST time
您可以根据需要将默认时区设置为PST / MST,然后获取日期。如果可能的话,我会在测试方法中这样做。
答案 2 :(得分:2)
(a)使用Joda-Time(或Java 8中内置的新JSR 310)。甚至不要考虑使用臭名昭着的java.util.Date/Calendar。
(b)你的问题不明确。您对答案的评论与比较有关,但您在提问中没有提及比较。
(c)避免使用3个字母的时区缩写。请阅读TimeZone类的Joda-Time文档中的弃用说明。
(d)避免默认时区。说出你的意思。您的计算机的时区可能会有意或无意地改变。
(e)在'joda'中搜索StackOverflow以获取大量代码片段和示例。
(f)这里有一些Joda-Time示例代码可以帮助您入门。
// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// Specify your time zone rather than rely on default.
org.joda.time.DateTimeZone californiaTimeZone = org.joda.time.DateTimeZone.forID( "America/Los_Angeles" );
org.joda.time.DateTimeZone denverTimeZone = org.joda.time.DateTimeZone.forID( "America/Denver" );
org.joda.time.DateTime nowDenver = new org.joda.time.DateTime( denverTimeZone );
org.joda.time.DateTime nowCalifornia = nowDenver.toDateTime( californiaTimeZone );
// Same moment in the Universe’s timeline, but presented in the local context.
System.out.println( "nowDenver: " + nowDenver );
System.out.println( "nowCalifornia: " + nowCalifornia );
跑步时......
nowDenver: 2013-11-21T18:12:49.372-07:00
nowCalifornia: 2013-11-21T17:12:49.372-08:00
关于Joda-Time ......
// Joda-Time - The popular alternative to Sun/Oracle's notoriously bad date, time, and calendar classes bundled with Java 7 and earlier.
// http://www.joda.org/joda-time/
// Joda-Time will become outmoded by the JSR 310 Date and Time API introduced in Java 8.
// JSR 310 was inspired by Joda-Time but is not directly based on it.
// http://jcp.org/en/jsr/detail?id=310
// By default, Joda-Time produces strings in the standard ISO 8601 format.
// https://en.wikipedia.org/wiki/ISO_8601
// About Daylight Saving Time (DST): https://en.wikipedia.org/wiki/Daylight_saving_time
// Time Zone list: http://joda-time.sourceforge.net/timezones.html
答案 3 :(得分:1)
ZonedDateTime
.now(
ZoneId.of( "America/Los_Angeles" )
)
请参阅此code run live at IdeOne.com。 (请注意,今天该站点上的系统时钟似乎慢了半个小时。)
zdt.toString():2019-07-27T12:29:42.029531-07:00 [America / Los_Angeles]
现代方法使用JSR 310中定义的Java 8及更高版本中内置的 java.time 类。
我在MST中,而我希望在PST中约会。我设置了我想要的timeZone。
从不依赖于运行时JVM的当前默认时区。作为程序员,您无法控制该默认值。因此,您的代码结果可能会意外地变化。
始终为日期时间方法指定可选的时区参数。
现在,如果我执行c.getTime(),我将始终获得服务器时间。
学会不思考客户端时间或服务器时间,而是思考UTC。您的大多数业务逻辑,数据存储,数据交换和日志记录应在UTC中完成。可以将UTC视为一个真实时间™,而所有其他偏移量/区域仅是变化而已。
对于UTC,请使用Instant
。
Instant instant = Instant.now() ; // Capture the current moment in UTC.
以标准ISO 8601格式生成表示该时刻的文本。
String output = instant.toString() ;
我要的是太平洋日期时间。请帮助如何获取指定时区中的日期时间对象。
您的条款(Pacific
,MST
或PST
)都不是真实的时区。
以Continent/Region
的格式指定proper time zone name,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用2-4个字母的缩写,例如EST
或IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
要从UTC调整为时区,请应用ZoneId
以获得ZonedDateTime
。
ZoneId z = ZoneId.of( "America/Edmonton" ) ; // https://time.is/Edmonton
ZonedDateTime zdt = instant.atZone( z ) ;
并尝试在北美西海岸的时区之一。
ZoneId z = ZoneId.of( "America/Los_Angeles" ) ; // https://time.is/Los_Angeles
ZonedDateTime zdt = instant.atZone( z ) ;
要生成ISO 8601以外的格式的字符串,请使用DateTimeFormatter
类。搜索堆栈溢出,因为已经有很多次了。
java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
目前位于Joda-Time的maintenance mode项目建议迁移到java.time类。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。
答案 4 :(得分:0)
Java Date对象没有时区 - 它只代表一个时间点。
如果要将日期格式化为时区,可以在DateFormat类中进行设置。例如:
Date date = new Date ();
DateFormat df = DateFormat.getDateTimeInstance();
df.setTimeZone(TimeZone.getTimeZone("PST"));
System.out.println(df.format(date));
df.setTimeZone(TimeZone.getTimeZone("EST"));
System.out.println(df.format(date));
将在PST中显示时间,然后在EST中显示时间。
答案 5 :(得分:0)
最近我本人也遇到了类似的问题,并且将时区设置为区域设置对我来说效果更好(即不是EST / EDT,而是America / New_York)。我尝试过EST,然后尝试做EDT的夏令时补偿工作,事实证明这要容易得多。将您的时区设置为您想要的任何时区,然后使用Date对象创建一个新日期,它将用于该时区。然后,您可以根据需要使用format方法获取时间戳。
TimeZone.setDefault(TimeZone.getTimeZone("America/New_York"));
Date date = new Date();
timeStamp = date.format('yyyy-MM-dd HH:mm:ss.SSSZ');
System.out.println(timeStamp);
返回
"2019-07-25 17:09:23:626-0400"