Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用java显示基于客户机/服务器偏移量的本地时间_Java_Calendar_Timezone_Client_Gmt - Fatal编程技术网

用java显示基于客户机/服务器偏移量的本地时间

用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

我的客户端/浏览器在印度,我从javascript获得时区偏移 使用以下代码:

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