programing

p:calendar를 사용하여 시작 날짜와 종료 날짜를 상호 제한(검증 없음)

lastmemo 2023. 3. 27. 20:57
반응형

p:calendar를 사용하여 시작 날짜와 종료 날짜를 상호 제한(검증 없음)

사용자에게 각각 시작일과 종료일을 나타내는 2개의 p:calendar 컴포넌트를 제시해야 합니다.두 날짜 모두 날짜, 시간 및 분을 가집니다.는 완벽한 Prime Faces를 있습니다.mindate,maxdate,minHour,maxHour,minMinute , , , , 입니다.minMinute사용할 수 있습니다.

현재 요건은 다음과 같습니다.

시작 날짜/시간을 종료 날짜/시간 이상으로 설정할 수 없습니다.종료 날짜/시간을 종료 날짜/시간 이하로 설정할 수 없습니다.

다음 방정식이 참이어야 합니다.

begin datetime < end datetime

이제 다음 JSF를 사용해 보겠습니다.

<p:calendar id="begin-date"
            value="#{debugManager.selectedBeginDate}"
            mindate="#{debugManager.minBeginDate}"
            maxdate="#{debugManager.maxBeginDate}"
            maxHour="#{debugManager.maxBeginHour}"
            maxMinute="#{debugManager.maxBeginMinute}"
            pattern="yyyy-MM-dd HH:mm"
            showButtonPanel="true"
            readonlyInput="true"
            navigator="true"
            showOn="button"
            required="true">
    <p:ajax event="dateSelect" update="end-date" />
</p:calendar>

<p:calendar id="end-date"
            value="#{debugManager.selectedEndDate}"
            mindate="#{debugManager.minEndDate}"
            minHour="#{debugManager.minEndHour}"
            minMinute="#{debugManager.minEndMinute}"
            pattern="yyyy-MM-dd HH:mm"
            showButtonPanel="true"
            readonlyInput="true"
            navigator="true"
            showOn="button">
    <p:ajax event="dateSelect" update="begin-date" />
</p:calendar>

다음은 min/max 방법의 예시입니다(종료일 기준).

public Date getMinEndDate()
{
    return this.getSelectedBeginDate();
}

보시는 바와 같이 최소 종료일은 현재 AJAX가 선택한 시작 날짜입니다.종료일을 올바르게 설정하면 시작일을 종료일보다 늦게 설정할 수 없습니다.

문제는 시간을 방정식에 포함시킬 때 시작된다...

p:calendar 인터페이스에는 다른 메서드가 있기 때문에 bean은 다음 로직을 제공해야 합니다.

public int getMinEndHour()
{
    Date selectedBeginDate = this.getSelectedBeginDate();
    Date selectedEndDate = this.getSelectedEndDate();

    if ( selectedBeginDate != null && DateUtil.isSameDay( selectedBeginDate, selectedEndDate ) )
    {
        return DateUtil.getHourOf( selectedBeginDate );
    }

    return ComplianceConstants.DEFAULT_COMPLIANCE_CASE_MIN_END_HOUR;
}

되어 있고 종료시간」)을 합니다.minHour이치노

조작:

Set the begin datetime to 2013-04-20 12:34 (legit)
Set the end   datetime to 2013-04-22 00:00 (legit)

이제 종료 날짜의 시간은 00:00이며 종료 시간이 최소한 12:35로 조정되는 한 2013-04-20 달력 날짜를 선택할 수 있습니다.

그러나 p:calendar 컴포넌트는 이 사실을 알 수 없습니다.

sets the end datetime to 2013-04-20 00:00 (legit, but false)

...

여기서 문제는 사용자가 일정표에서 특정 새로운 종료일을 눌렀을 때 mindate/maxdate Atribute에 의해 시작일과 같은 값을 치도록 사용자를 제한할 수 없다는 것입니다.종료일같은 시작일보다 이전인 경우(잘못됨) 어쩔 수 없습니다.

이제 팔로업 문제는 사용자가 달력을 닫고 제출 버튼을 누르면 잘못된 데이터를 DB에 삽입할 수 있다는 것입니다.물론 검증자를 실행할 수도 있지만 검증자를 사용하지 않고 어떻게든 이를 달성해야 합니다.

에 하려고 은 '하다', '접촉하다', '접촉하다'였습니다.setSelectedBeginDate( Date selectedBeginDate ) ★★★★★★★★★★★★★★★★★」setSelectedEndDate( Date selectedEndDate ) 조정 java.util.Date같은 날짜일 경우 시간 부분을 지정합니다.다음과 같이 합니다.

public void adjustSelectedEndDate()
{
    if ( this.selectedEndDate != null )
    {
        this.log.infov( "adjustSelectedEndDate: b-hour = {0}, e-hour = {1}", DateUtil.getHourOf( this.selectedBeginDate ), DateUtil.getHourOf( this.selectedEndDate ) );

        if ( DateUtil.isSameDay( this.selectedBeginDate, this.selectedEndDate ) &&
            ( DateUtil.getHourOf( this.selectedEndDate ) < DateUtil.getHourOf( this.selectedBeginDate ) ) ||
              DateUtil.getHourOf( this.selectedEndDate ) == DateUtil.getHourOf( this.selectedBeginDate ) && DateUtil.getMinuteOf( this.selectedEndDate ) <= DateUtil.getMinuteOf( this.selectedBeginDate ) )
        {
            this.log.info( "Adjusting selected end date!" );

            this.selectedEndDate = DateUtil.addOneMinuteTo( DateUtil.copyTime( this.selectedBeginDate, this.selectedEndDate ) );
        }
    }
}

해서 this this음음음음음음음음 、 this 、 this 、 this 、 this 、 this this 。@thisupdatep:calendargetter)가getSelectedBeginDate() ★★★★★★★★★★★★★★★★★」getSelectedEndDate+ 업데이트 중에 최소/최대 제한)이 호출됩니다.

@this그러나 업데이트 시 p:components를 혼동하여 시간 슬라이더를 한 번만 슬라이더로 만듭니다.이후의 슬라이더 이벤트는 단순히 무시되며 파손된 상태로 동작합니다.

질문

  • 이 문제를 해결하기 위해 일반적으로 어떻게 접근합니까?
  • p:remoteCommand우가원 원하 을을 ?? ???

옵션 Q:

  • PrimeFaces p:calendar가 단일 minDateTime과 maxDateTime을 제공하도록 구현되지 않은 이유는 무엇입니까?

내가 말한 이 시나리오는 이미 해결되었을 거야.이 문제를 해결하기 위한 접근법(또는 일부 해결책도 공유)에 대해 설명해 주시면 감사하겠습니다.

서문:

저는 JSF와 일하지 않지만, 몇 가지 이유로 원하는 곳으로 돌아갈 수 있습니다.

a) 표준 캘린더에서 dateTime의 날짜 부분만 사용할 경우 다음 사용을 고려하십시오.

someCalendar.set(Calendar.MILLISECOND, 0)

b) 많은 상황에서 정확성, 성능 및 사용 편의성을 위해 표준 라이브러리보다 joda-time(여기, 여기 및 기타 많은 장소) 사용을 권장하는 것으로 보이므로 joda-time 사용을 고려하십시오.

가 각 콜에서 포스트백만 , 각가 얼굴 를 들면 bean 스코프)를 것을 확인합니다.FacesContext facesContext = FacesContext.getCurrentInstance();)

d)mindate그리고 이런 것들은 당신이 기대했던 것처럼 작동하지 않을 것이다. 그리고 나는 자동적인 동작이 그렇게 쉽게 중단될 것이라고 기대하지 않는다.

이러한 옵션을 사용할 수 없는 경우, 고객이 가지고 있는 모든 것을 직접 수행해야 하는 경우:

Philisophical / UX: 내가 가장 먼저 하고 싶은 일은 두 날짜의 배치나 관점에 대한 기대를 없애는 것이다.시간 표시줄에서 방향을 표시하거나 예상하는 벡터로 처리하지 마십시오.

  • 는 「」, 「」입니다.start ★★★★★★★★★★★★★★★★★」from 그 날짜end ★★★★★★★★★★★★★★★★★」to날짜? 아니요, 과거 데이터의 쿼리 또는 아직 발생하지 않았거나 이미 발생한 이벤트에 대한 수정 적용에서 볼 수 있습니다.

    이 함축된 내용은 사용자가 '뒤로' 돌아가는지 '뒤로' 돌아가는지, 아니면 '뒤로' 돌아가는지에 대해 혼동하기 쉽습니다(또한 자신을 혼동할 수 있습니다.에, 나는 그 이 있는 한 할 것이다.a pair of dates또는range또는period간격을 선언하고 결과적으로 선택된 값에 따라 타임라인에서 상대적인 위치를 추론합니다.이렇게 하면 날짜가 결코 동일하지 않고 왼쪽이 항상 왼쪽, 오른쪽이 항상 오른쪽이라는 각각의 고유한 요건을 충족할 수 있습니다.

우리는 '시작'이나 '시작'이 무엇을 의미하는지 유추할 수는 없지만, 연대기적 연대표의 오른쪽, 왼쪽, 그리고 중간이라는 의미와 상대적인 관계를 유추할 수 있다.주의: 계산 또는 비교를 수행하기 전에 항상 날짜를 UTC로 해결하십시오.

long oneDateValue = oneDate.toUtc().toMilliseconds();
long anotherDateValue = anotherDate.toUtc().toMilliseconds();

long right = max (oneDateValue, anotherDateValue);
long left = min (oneDateValue, anotherDateValue);

정밀도 평가:어떤 언어로든 날짜 범위를 다룰 때 두 번째로 살펴봐야 할 것은 부동 소수점 숫자를 다루는 방법과 유사합니다.비교를 위해 동일성을 비교하지 말고 델타를 "허용 가능한 오차 수준"과 비교하십시오.즉, 어플리케이션은 실제로 어느 정도의 정밀도만을 고려하므로 그 정밀도만을 캡처하여 검토해야 합니다.

const int dateTimeResolutionInMs = 86400000; // milliseconds per day

public bool areEssentiallySame(long left, long right) {

   // the difference between right and left is less than our precision 
   // requires, thus dates are effectively the same
   return (right - left < dateTimeResolutionInMs);
}

강제 정밀도:셋째, 해상도 범위 내라도 가치의 차이를 어떻게 해결할 것인가(아웃 어플리케이션에는 처리 능력, 기대 또는 요구 이상의 정밀도가 주어졌습니다).

long diff = value % dateTimeResolutionInMs;

  1. 잘라내기:return value - diff;

  2. 가장 가까운 (바이어스 포함): return value + (diff < dateTimeResolutionInMs/ 2) ? -1 * diff : dateTimeResolutionInMs - diff;

  3. 기타: 원하는 해상도 또는 정밀도로 값을 축소하거나 확장하기 위한 다른 많은 전략이 있습니다.

부록:Post-Backs/Ajax 콜에 의해 실행되는 이벤트에 대해 예상되는 값을 포함한 뷰를 반환하는 경우calendar서문에 있는 노트가 당신에게 아무런 도움이 되지 않았고, 당신의 콩이 제대로 등록되고 인식되고 있는 것을 확실히 알고 있다면, 당신은 그 우려를 새로운 질문으로 분리하는 것이 좋을지도 모릅니다.바람직하지 않은 동작의 원인이 되는 브라우저/브라우저 버전 고유의 문제가 있을 수 있습니다.다른 문제들과 마찬가지로 이미 알려진 문제와 알려지지 않은 문제가 모두 존재합니다.

언급URL : https://stackoverflow.com/questions/16162554/mutually-restricting-begin-and-end-date-times-using-pcalendar-no-validation

반응형