【问题标题】:Reading Client Side Time Zone in Server Side java class在服务器端java类中读取客户端时区
【发布时间】:2011-11-21 07:25:09
【问题描述】:

我有一个向服务器端程序发送时间的客户端程序。
我正在使用 Callendar 对象将时间值从客户端传递到服务器。
我的客户端程序位于斯里兰卡,服务器位于英国。
当我在客户端发送时间(例如:2011-11-21T12:43:41.352+05:30)时,通常是在服务器上转换为英国时间的时间(例如:2011-11-21T07:13:411.352 +00:00)。
我想要做的是我想用客户端程序中的时区来获取我在客户端程序中发送的时间。(简单来说,我想读取服务器中的时间而不适用于时间的时区转换由客户端程序发送。所以在服务器中我想获得时间为 2011-11-21T12:43:41.352+05:30 而不是 2011-11-21T07:13:411.352+00:00)。

我能知道这是否可以用 java 来做,如果可以,怎么做?

客户端:

Calendar cal1 = Calendar.getInstance();
Date indate = new Date(); // this shows as 2011-11-21T12:43:41.352+05:30
searchDateRange_type0.setStart(cal1);
cal1.setTime(inDate); 

服务器端:

SearchDateRange_type0 serachDaterange= criterion_type.getSearchDateRange();
checkInDate     = serachDaterange.getStart().getTime(); //I read this as 2011-11-21T07:13:411.352+00:00

【问题讨论】:

    标签: java


    【解决方案1】:

    了解Date 值没有时区很重要。它只代表一个瞬间。当您调用Date.toString() 时,它使用您调用它的系统的默认时区。这就是为什么你会得到你现在的行为。

    所以看起来瞬间本身被正确读取 - 但如果您对 local 时间而不是 instant 时间感兴趣,有两种选择:

    • 传递时区标识符(例如“Europe/Paris”)以及作为即时时间
    • 传递一个本地日期或日期/时间,不要一开始就将其视为即时时间

    很难确切知道哪一个最适合您的情况。我们需要更多地了解应用程序在做什么,以及您如何传输信息。

    建议使用Joda Time 而不是内置的日期/时间库 - 这是一个更好的 API,可以帮助您区分本地时间和瞬间。

    【讨论】:

    • 非常感谢 Jon 的 cmets。实际上,我正在开发的是一个 Web 服务应用程序,它根据用户提供的日期和时间向用户提供库存。在这里,日期和时间起着关键作用。
    • @NamalFernando:但是您对他们提供的instantlocal 日期和时间感兴趣吗?你在用价值做什么?例如,“向我显示与某天在我的本地时区 匹配的所有内容”和“向我显示某个特定时刻之前的所有内容”之间存在很大差异。
    • @ Jon :我对他们提供的那一刻很感兴趣。简单地说,为了提供库存,我想要他们发送的时间 - 而不是转换为服务器时区后的时间。谢谢。
    • @ Jon :我对他们提供的那一刻很感兴趣。简单地说,为了提供库存,我想要他们发送的时间 - 而不是转换为服务器时区后的时间。谢谢。
    • @NamalFernando:你在自相矛盾。 2011-11-21T12:43:41.352+05:30 和 2011-11-21T07:13:411.352+00:00 代表相同的时间瞬间 - 所以瞬间 正在 被适当地转换。如果您实际上只想要瞬间,那很好。如果您想要 本地 时间,则需要更改代码。
    【解决方案2】:

    这里的问题是当java客户端日历转换日期时,它也设置了它的时区。如果您要清除它并且只需要从服务器日历对象中获取日期,请在客户端设置时区时将客户端日历时间分钟和秒设置为 0。

    例如。在客户端,

    Date indate     = new Date("21-Nov-2011");
    
    Calendar cal1 = Calendar.getInstance();     
    cal1.setTime(indate);   
    
    // set the time zone same as server time zone.  
    cal1.setTimeZone(TimeZone.getTimeZone("GMT"));
    
    // then clear out the rest in oder to get only the date.
    cal1.set(Calendar.HOUR, 0);
    cal1.set(Calendar.MINUTE, 0);
    cal1.set(Calendar.SECOND, 0);    
    

    所以服务器只能从客户端获得相同的日期,没有时区或小时。

    【讨论】:

    • 非常感谢sameera。 +1 开箱即用的想法,“清除其余部分以仅获取日期”。但由于我的程序需要打发时间,我重新分配了它们而不是清除它们。 (例如:cal1.set(Calendar.HOUR, indate.getHours());...)。现在我将服务器中的时间设置为 2011-11-21T12:43:41.352+00:00 为 2011-11-21T12:43:41.352+05:30。是的,在这里我没有在服务器端将 TimeZone 设为 05.30。但它仍然对我有用,因为它不会根据不同的时区转换时间。但是,在这里,事先知道服务器的 TimeZone 是不是很无聊?
    • 是的,您必须知道服务器时间才能匹配客户端和服务器日期。
    【解决方案3】:

    服务器设置时间后,即可调用。
    Calendar.setTimezone()
    问题是,您必须知道客户的时区。

    【讨论】:

    • 是的。这也是我的问题。我想知道一种了解客户时区的方法。非常感谢bugs_的评论。
    • 正如乔恩所说。您必须从客户端发送 TimeZone 以及 Date。
    • 是的 bugs_,但问题是 TimeZone 正在转换为服务器的时区。
    • 您必须在客户端调用 getTimeZone 并将其与 Date 一起发送到服务器。并在服务器上调用 setTimeZone。没有明确设置时区服务器使用其默认时区。 (日期不包含有关时区的信息 - 它只是即时时间。 - 内部表示为一个“长”值。)
    • “没有明确设置时区”debug_是什么意思?因为,时区必须像 Calendar.setTimeZone(TimeZone value) 一样显式传递给它。日历没有“Calendar.setTimeZone()”方法(不带参数)对吧?
    【解决方案4】:

    日期和时间转换为服务器时区格式(例如:CST 到 IST)

    注意:我的服务器以 IST 格式运行(通过默认 JVM 已占用操作系统时区)。

        String inputDateString  = "2013-10-26 09:36:00";
        String timezoneID       = "CST";
    
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
        dateFormat.parse(inputDateString+" "+timezoneID);
    
        DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        formatter.setTimeZone(TimeZone.getTimeZone(dateFormat.getTimeZone().getID()));
    
        Date outputDate = formatter.parse(inputDateString);
        System.out.println(outputDate);
    

    输出: 2013 年 10 月 26 日星期六 20:06:00 IST

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      • 2012-09-21
      • 2017-06-19
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      • 2017-09-19
      相关资源
      最近更新 更多