代码之家  ›  专栏  ›  技术社区  ›  Roman Goyenko

JSTL和时区

  •  3
  • Roman Goyenko  · 技术社区  · 15 年前

    我有一些关于时区的问题。我们以UTC时间存储所有日期,但我们需要同时以本地(美国东部)时间和UTC显示其中一些日期。

    这是我的测试,我有一个UTC日期,希望以UTC和本地时间显示:

    <html>
    <!-- let's assume this date is in UTC, I get it from Database in my code -->
    <jsp:useBean id="dateValue" class="java.util.Date" />
    
    GMT
    <fmt:formatDate value="${dateValue}" pattern="yyyy-MM-dd HH:mm:ss z" timeZone="GMT"/>
    </html>
    <!-- Displays the original time +4  - not what I need-->
    
    No time zone
    <fmt:formatDate value="${dateValue}" pattern="yyyy-MM-dd HH:mm:ss z"/> 
    <!-- Displays the original time, but timezone is EDT -->
    
    US/Eastern
    <fmt:formatDate value="${dateValue}" pattern="yyyy-MM-dd HH:mm:ss z" timeZone="US/Eastern"/> 
    <!-- Displays the original time, timezone is EDT, I need original + 4 -->
    
    </html>
    

    重申: 我有一个来自数据库的UTC时间,想要格式化它并以UTC时区显示。服务器在除UTC以外的其他时区运行。

    基本上我需要一个函数

    convertToTimezone(date, originalTimeZone, desiredTimeZone). 
    

    fmt:formtate提供的是

    convertToTimezone(date, serverTimeZone, desiredTimeZone). 
    

    我可以破解它,但这通常会在夏时制等情况下造成问题。

    附笔。 对于那些寻找答案的人来说——要做的一件事是在UTC中运行服务器,那么转换就可以正常工作。如果不能改变,唯一的方法就是用UTC时区创建新的日期,明确地做,我自己把时间转换成文本,然后创建一个新的日期,并提供来自文本和UTC时区的数据。如果不这样做,将从服务器读取时区。

    6 回复  |  直到 11 年前
        1
  •  12
  •   Community Mohan Dere    8 年前

    我不明白你的问题。一切正常。你好像在期待 new Date() 将计算机时间视为格林尼治标准时间,即格林尼治标准时间19:21。这是错误的。它计算 真实的 基于计算机时区的GMT时间。这个 fmt:setTimeZone 不会改变计算机的时区,也不会改变 新日期() . 这个 fmt:设置时区 只需设置所有日期的默认时区 fmt:formatDate . 只有当计算机的时区不是格林尼治标准时间时,这才是必需的。

    删除 fmt:设置时区 你会看到日期(错误地)在4个小时前就取消了。然后用启动服务器 -Duser.timezone=UTC (将计算机的时区设为默认值),您将再次看到它是正确的。也可以尝试一下 真实的 数据库中的日期,而不是 新日期() .

    无论如何,在UTC以外的时区运行服务器是一种糟糕的做法。它只会导致各种颜色的麻烦。我强烈建议以UTC格式运行服务器。如果您出于某种原因不想更改机器的时区,那么可以通过添加 -duser.timezone=UTC 到服务器的VM参数。使用UTC 总是 只有在你 显示 给最终用户。另请参见 DST and Timezone best practices .

        2
  •  2
  •   Matt Ball    15 年前

    Java假定您的时间是GMT+ 4,因为您的系统时间是GMT+ 4。

        3
  •  2
  •   Sackers    15 年前

    尝试:

    <fmt:setTimeZone value="Europe/London" scope="session"/>
    
        4
  •  2
  •   Borja Bablu Barman    11 年前

    您需要使用国际时间(UTC/ZULU)添加以下计划客户端时间使用,例如“GMT+1”。请参阅此示例。

    将此参数作为参数放入服务器以设置UTC时间使用,在本例中是针对Tomcat的:

    -duser.timezone=“协调世界时”

    /* Java */      
    
    @RequestMapping(value = "/web", method = { RequestMethod.POST, RequestMethod.GET })
    public String web(Model model, HttpSession session, Locale locale) {
    
        Date today = new Date();
        model.addAttribute("currentTime", today);
        model.addAttribute("timezone", "GMT+1");
    
        return "web";
    }
    

    要显示日期,请选择所需的图案(属性)

    /* JSP web */
    
    <fmt:timeZone value="${timezone}">
    <spring:message code="date_format_dateMin" var="pattern"/>
    <fmt:formatDate value="${currentTime}" timeZone="${timezone}" pattern="${pattern}" var="searchFormated" />
    <span class="innerLabel">${searchFormated}</span>   
    </fmt:timeZone>
    
    /* Properties */
    
    date_format_dateMin=yyyy/MM/dd HH:mm
    date_format=yyyy/MM/dd HH:mm:ss    
    date_format2=yyyy/MM/dd
    date_format3_js=yy/mm/dd
    date_format4_time=HH:mm
    date_format4=dd/MM/yyyy HH:mm:ss
    
        5
  •  2
  •   Borja Bablu Barman    11 年前

    要转换UTC时间,我使用此函数:

     public Date getUTCDateFromString(String fecha, Locale yourLocale) {
        SimpleDateFormat simpleDateFormat = new 
        SimpleDateFormat("yyyy-MM-dd HH:mm:ss", yourLocale);
        TimeZone utcZone = TimeZone.getTimeZone("UTC");
        simpleDateFormat.setTimeZone(utcZone);
        Date date = null;
        try {
            date = simpleDateFormat.parse(fecha);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
        }
    
        6
  •  0
  •   Syed Priom    13 年前
    <c:when test="${currentField eq 'dateline'}">
      <c:set target="${storyContent}" property="publishedDate">
      <fmt:formatDate value="${article.publishedDateAsDate}" timeZone="Asia/Dacca"       pattern="${storyContent.dateFormat}"/>
      </c:set>
    

    我已经处理这个问题3天了。

    一开始是这样的-

    <fmt:formatDate value="${article.publishedDateAsDate}" pattern="${storyContent.dateFormat}"/>
    

    它以服务器时间UTC+00小时显示日期。

    我想在达卡时间显示它,保持服务器时间不变。 添加这个解决了问题-

    timezone=“亚洲/达卡”

    您可以在这里找到所有的Java时区详细信息。 http://joda-time.sourceforge.net/timezones.html