2014-10-21 3 views
1

Freemarker에서 .now?time을 사용하면 현재 시간을 알 수 있지만 다른 시간과 어떻게 비교합니까?freemarker에서 시간을 비교하는 방법?

예를 들어, 현재 시간이 오전 8시에서 오후 5시 사이인지 제대로 테스트하려면 어떻게해야합니까?

<#if .now?time gte (?) && .now?time lte (?)> 
    //do something 
<#/if> 

Freemarker에서 날짜 스칼라를 만드는 방법을 모르므로 무엇을 넣어야할지 모르십니까?

답변

2

freemarker 2.3.21의 소스를 읽고 현재 freemarker가 과 같은 .now?time과 시간 객체를 비교하는 것을 지원하지 않는다는 것을 발견했습니다. .now?time 때문이다

1970-01-01 08:00:00 내부적으로 처리되어, 2014-10-21 15:11:30, "8:00:00 AM"?time 와 같이 현재 시간으로 간주된다.

따라서 <#if .now?time gte "8:00:00 AM"?time >은 항상 true입니다.

버그라고 생각되면 http://sourceforge.net/p/freemarker/bugs/에게 신고하거나 freemarker의 메일 링리스트에 질문을 보낼 수 있습니다.

따라서 현재 해결 방법은 Date 개체를 만들고 Java 코드에서 비교하는 것입니다.

+0

FreeMarker는 가능한 한 서식 지정 측면만을 다룹니다. 보통'$ {dt} '가'2014-10-21 15 : 11 : 30'과 같이 인쇄되면'$ {dt? time}'은'15 : 11 : 30'을 출력합니다. 그러나 객체의 Java 값은 변경되지 않아야합니다. 특히 Java가 시간 유형 (이전 Java 8 이상)을 정의하지는 않아야합니다. – ddekany

1

둘 다 동일한 종류 (두 가지가 모두 시간 전용 값임) 인 경우 두 개의 값을 비교할 수 있지만 내부 표현이 일관성이 있는지 확인하는 것은 사용자의 몫입니다 (예 : 유일한 값은 다른 날에 그 시대의 VS에있다). 따라서 대부분의 경우 해당 문제가없는 날짜 - 시간 값 (타임 스탬프)을 비교하는 데 사용됩니다. 로케일 특정 형식이기 때문에, 그러나, 나는 ISO 포맷을 사용하는 것이 좋습니다, 그것은 "8:00:00 AM"?time와 제대로 비교입니다 이제

<#assign nowTime = .now?time?string.iso?time.iso> 

: 당신은 당신이 획기적인 기반의 시간을 원하는 것을 알고 있기 때문에 그래서, 다음과 같은 해킹을 할 수 깨지기 쉬운 종류 (로케일을 변경하는 경우와 같이 작동하지 않음) : '08:00:00'?time.iso. 이를 위해서는 FreeMarker 2.3.21 이상이 필요합니다.

관련 문제