用java显示基于客户机/服务器偏移量的本地时间
我的客户端/浏览器在印度,我从javascript获得时区偏移 使用以下代码:用java显示基于客户机/服务器偏移量的本地时间,java,calendar,timezone,client,gmt,Java,Calendar,Timezone,Client,Gmt,我的客户端/浏览器在印度,我从javascript获得时区偏移 使用以下代码: var now = new Date(); var localOffSet = now.getTimezoneOffset(); -330 // for India int localOffSetMin = (localOffSet)*(-1); 我的服务器位于纽约,因此我使用以下方法获取其偏移量: TimeZone timeZone = now.getTimeZone(); int serverOffset
var now = new Date();
var localOffSet = now.getTimezoneOffset(); -330 // for India
int localOffSetMin = (localOffSet)*(-1);
我的服务器位于纽约,因此我使用以下方法获取其偏移量:
TimeZone timeZone = now.getTimeZone();
int serverOffset = timeZone.getRawOffset();
int serverOffSetMinutes = serverOffset / 60000; // -300 for America/New York
为了在我的机器上查找本地时间,我使用以下方法:
int offSets = Math.abs(serverOffSetMinutes-localOffSetMin);
now.setTime(createDt); // createDt is date field value for some column
now.add(Calendar.MINUTE, offSets); // adds offset
Date localDt = now.getTime();
但我得到的日期/时间比预期时间提前了1小时。我缺少什么?使用Java SE进行日期和时间操作
您可以使用以下代码打印支持的时区列表
public String printPeriod(String from, String to) {
Period period = new Period(new DateTime(DateTimeZone.forID(to)), new DateTime(DateTimeZone.forID(from)));
return PeriodFormat.getDefault().print(period);
}
然后,您可以使用以下代码查找并打印时区之间的差异。你必须注意夏令时
public void printTimeZoneDifference(String from, String to) {
TimeZone easternStandardTime = TimeZone.getTimeZone(from);
TimeZone indiaStandardTime = TimeZone.getTimeZone(to);
long milliseconds = easternStandardTime.getRawOffset() - indiaStandardTime.getRawOffset() + easternStandardTime.getDSTSavings() - indiaStandardTime.getDSTSavings();
String difference = String.format("%02d min, %02d sec", TimeUnit.MILLISECONDS.toMinutes(milliseconds), TimeUnit.MILLISECONDS.toSeconds(milliseconds) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milliseconds)));
System.out.println("The difference in time between" + easternStandardTime.getDisplayName() + " and " + indiaStandardTime.getDisplayName() + " is " + difference);
}
尽管如果我要写这样的东西,我可能会将一个时区对象作为参数传递,并让该方法单独负责减法。然后,我要么打印结果,要么将其作为另一种方法的一部分。我没有这样构造帖子,因为我想在帖子中包含所有相关的代码
使用Joda进行日期和时间操作
Java已经解决了这种类型的操作。如果你要进行大量的日期操作,那么Joda时间库可能是你最好的选择。如果您只在这一个实例中操纵时间,那么在运行时中包含依赖项就有点过分了
再次打印出时区
public void printDateTimeZones() {
for(String zone : DateTimeZone.getAvailableIDs()) {
System.out.println(zone);
}
}
然后,您可以使用以下代码中的默认格式返回两个日期时区之间的句点(差)字符串
public String printPeriod(String from, String to) {
Period period = new Period(new DateTime(DateTimeZone.forID(to)), new DateTime(DateTimeZone.forID(from)));
return PeriodFormat.getDefault().print(period);
}
类似地,Joda提供了一个format builder类,允许您指定首选格式
public String printPeriod(String from, String to) {
PeriodFormatter formatter = new PeriodFormatterBuilder()
.printZeroRarelyFirst()
.appendYears().appendSuffix(" Years").appendSeparator(",")
.appendMonths().appendSuffix(" Months").appendSeparator(",")
.appendWeeks().appendSuffix(" Weeks").appendSeparator(",")
.appendDays().appendSuffix(" Days").appendSeparator(",")
.appendHours().appendSuffix(" Hours").appendSeparator(",")
.appendSeconds().appendSuffix(" Seconds").appendSeparator(",")
.appendMillis().appendSuffix(" Milliseconds")
.toFormatter();
return formatter.print(new Period(new DateTime(DateTimeZone.forID(from)), new DateTime(DateTimeZone.forID(to))));
}
使用JavaSE进行日期和时间操作
您可以使用以下代码打印支持的时区列表
public String printPeriod(String from, String to) {
Period period = new Period(new DateTime(DateTimeZone.forID(to)), new DateTime(DateTimeZone.forID(from)));
return PeriodFormat.getDefault().print(period);
}
然后,您可以使用以下代码查找并打印时区之间的差异。你必须注意夏令时
public void printTimeZoneDifference(String from, String to) {
TimeZone easternStandardTime = TimeZone.getTimeZone(from);
TimeZone indiaStandardTime = TimeZone.getTimeZone(to);
long milliseconds = easternStandardTime.getRawOffset() - indiaStandardTime.getRawOffset() + easternStandardTime.getDSTSavings() - indiaStandardTime.getDSTSavings();
String difference = String.format("%02d min, %02d sec", TimeUnit.MILLISECONDS.toMinutes(milliseconds), TimeUnit.MILLISECONDS.toSeconds(milliseconds) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milliseconds)));
System.out.println("The difference in time between" + easternStandardTime.getDisplayName() + " and " + indiaStandardTime.getDisplayName() + " is " + difference);
}
尽管如果我要写这样的东西,我可能会将一个时区对象作为参数传递,并让该方法单独负责减法。然后,我要么打印结果,要么将其作为另一种方法的一部分。我没有这样构造帖子,因为我想在帖子中包含所有相关的代码
使用Joda进行日期和时间操作
Java已经解决了这种类型的操作。如果你要进行大量的日期操作,那么Joda时间库可能是你最好的选择。如果您只在这一个实例中操纵时间,那么在运行时中包含依赖项就有点过分了
再次打印出时区
public void printDateTimeZones() {
for(String zone : DateTimeZone.getAvailableIDs()) {
System.out.println(zone);
}
}
然后,您可以使用以下代码中的默认格式返回两个日期时区之间的句点(差)字符串
public String printPeriod(String from, String to) {
Period period = new Period(new DateTime(DateTimeZone.forID(to)), new DateTime(DateTimeZone.forID(from)));
return PeriodFormat.getDefault().print(period);
}
类似地,Joda提供了一个format builder类,允许您指定首选格式
public String printPeriod(String from, String to) {
PeriodFormatter formatter = new PeriodFormatterBuilder()
.printZeroRarelyFirst()
.appendYears().appendSuffix(" Years").appendSeparator(",")
.appendMonths().appendSuffix(" Months").appendSeparator(",")
.appendWeeks().appendSuffix(" Weeks").appendSeparator(",")
.appendDays().appendSuffix(" Days").appendSeparator(",")
.appendHours().appendSuffix(" Hours").appendSeparator(",")
.appendSeconds().appendSuffix(" Seconds").appendSeparator(",")
.appendMillis().appendSuffix(" Milliseconds")
.toFormatter();
return formatter.print(new Period(new DateTime(DateTimeZone.forID(from)), new DateTime(DateTimeZone.forID(to))));
}
一个
java.util.Date
对象。它只有一个long
值,它是从1970-01-01T00:00:00Z
开始的毫秒数(也称为“unix历元”或“历元”)。该值完全独立于时区(您也可以说“它在UTC中”)
要将此值转换为另一时区,您不需要在时区之间执行所有这些数学。您只需获取这个毫秒值并将其转换为所需的时区
要从javascript获取值,只需执行以下操作:
var d = new Date();
var millis = d.getTime();
Date date = new Date(1499101493296L);
变量millis
将包含从历元开始的毫秒数。在我做的测试中,这个值是1499101493296
要创建java.util.Date
对象,只需执行以下操作:
var d = new Date();
var millis = d.getTime();
Date date = new Date(1499101493296L);
要在所需时区中设置此日期的格式,请使用SimpleDateFormat
:
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata"));
System.out.println(sdf.format(date));
输出将是:
2017年7月3日22:34:53
如果需要其他格式,请查看以了解更多信息
还请注意,我使用了一个时区名称,使用(始终采用大陆/城市
,如美国/圣保罗
或欧洲/柏林
)。
避免使用三个字母的缩写(如IST
或EST
),因为它们是
要使用另一个时区,可以使用一个-使用timezone.getAvailableIDs()
检查所有可用名称
新的Java日期/时间API 旧类(
Date
、Calendar
和SimpleDateFormat
)具有和,它们正在被新的API所取代
如果使用<强> java 8 < />,请考虑使用这更容易
如果您使用的是JavaA
Java.util.Date
对象。它只有一个long
值,它是从1970-01-01T00:00:00Z
开始的毫秒数(也称为“unix历元”或“历元”)。该值完全独立于时区(您也可以说“它在UTC中”)
要将此值转换为另一个时区,不需要在时区之间进行所有这些计算。您只需获取这个毫秒值并将其转换为所需的时区
要从javascript获取值,只需执行以下操作:
var d = new Date();
var millis = d.getTime();
Date date = new Date(1499101493296L);
变量millis
将包含从历元开始的毫秒数。在我做的测试中,这个值是1499101493296
要创建java.util.Date
对象,只需执行以下操作:
var d = new Date();
var millis = d.getTime();
Date date = new Date(1499101493296L);
要在所需时区中设置此日期的格式,请使用SimpleDateFormat
:
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata"));
System.out.println(sdf.format(date));
输出将是:
2017年7月3日22:34:53
如果需要其他格式,请查看以了解更多信息
还请注意,我使用了一个时区名称,使用(始终采用大陆/城市
,如美国/圣保罗
或欧洲/柏林
)。
避免使用三个字母的缩写(如IST
或EST
),因为它们是
要使用另一个时区,可以使用一个-使用timezone.getAvailableIDs()
检查所有可用名称
新的Java日期/时间API 旧类(
Date
,Ca