javaeeweb应用程序的当前日期有几天不确定

javaeeweb应用程序的当前日期有几天不确定,java,jakarta-ee,oracle10g,struts-1,tomcat5.5,Java,Jakarta Ee,Oracle10g,Struts 1,Tomcat5.5,我有一个web应用程序(JavaEE、Struts1.1、JSP、Tomcat5.5.20、WebLogic、Oracle)运行在Red Hat的Linux服务器上。有时,web应用程序的当前日期会“掉出来”。例如: 2013年1月31日改为:1994年1月12日 因此,由于日期的更改,用户在某些页面上提交按钮时遇到问题。当我重新启动tomcat并出现Web应用程序时,问题就解决了。这个问题有时会在一天内重复出现,并困扰我。 问题是什么?如何解决? 请帮帮我 代码jsp文件是:

我有一个web应用程序(JavaEE、Struts1.1、JSP、Tomcat5.5.20、WebLogic、Oracle)运行在Red Hat的Linux服务器上。有时,web应用程序的当前日期会“掉出来”。例如:

2013年1月31日改为:1994年1月12日 因此,由于日期的更改,用户在某些页面上提交按钮时遇到问题。当我重新启动tomcat并出现Web应用程序时,问题就解决了。这个问题有时会在一天内重复出现,并困扰我。 问题是什么?如何解决? 请帮帮我

代码jsp文件是:

        <TD ALIGN="center" width="35%"><P CLASS="SmallBlackRemark"><font class="RedColor"><b><%=DateUtil.stringDayMountYear()%></b></font></P></TD>
        import java.util.*;

        import java.text.SimpleDateFormat;

        import java.text.ParsePosition;

        import com.fdate.*;

        public class DateUtil{

          public static String getCurrentDate()
          {
            FDate curDate = new FDate(System.currentTimeMillis());
            return curDate.toString();
          }

          public static String getCurrentTime()
          {
            FDate curDate = new FDate(System.currentTimeMillis());
            String time = curDate.getHour() + ":"+curDate.getMinute()+":"+curDate.getSecond();
            return time;
          }

          public static int getCurrentYear()
          {
            FDate curDate = new FDate(System.currentTimeMillis());
            return curDate.getYear();
          }

          public static int getCurrentMonth()
          {
            FDate curDate = new FDate(System.currentTimeMillis());
            return curDate.getMonth();
          }


          public static int getCurrentDay()
          {
            FDate curDate = new FDate(System.currentTimeMillis());
            return curDate.getDate();
          }


        //reverse the order of dd and yyyy in a farsi date string just for fixing farsi presentation problem
          //suppose that input date is in the form of yyyy/mm/dd
          //the output would be as dd/mm/yyyy

          public static String stringDayMountYear(){
            return ShamsiCalendar.weekDayName(ShamsiCalendar.dayOfWeek(DateUtil.getCurrentDate()))+ " "+
                ShamsiCalendar.monthDayName(DateUtil.getCurrentDay())+
                ShamsiCalendar.monthName(DateUtil.getCurrentMonth()) +""  +
                String.valueOf(DateUtil.getCurrentYear());
          }

        }
        package com.fdate;

        import java.util.*;
        import java.text.*;

        public class ShamsiCalendar
        {
          protected static final TimeZone DEFAULT_TIMEZONE=TimeZone.getDefault();
          protected static final long DAY_MILLIS=1000*60*60*24;
          protected static final int HOUR_MILLIS=1000*60*60;
          protected static final int MINUTE_MILLIS=1000*60;
          protected static final String SH_ORIGIN_DATE="1379/01/01";
          protected static final int TIMEZONE_RAW_OFFSET=DEFAULT_TIMEZONE.getRawOffset();

          protected static final int TIMEZONE_RAW_OFFSET_HOUR=TIMEZONE_RAW_OFFSET/HOUR_MILLIS;

          protected static final int TIMEZONE_RAW_OFFSET_MINUTE=(TIMEZONE_RAW_OFFSET-(HOUR_MILLIS*TIMEZONE_RAW_OFFSET_HOUR))/MINUTE_MILLIS;

        //  protected static final Date MI_ORIGIN_DATE=new Date(new GregorianCalendar(2000,Calendar.MARCH,20,0,0,0).getTimeInMillis());

          protected static final Date MI_ORIGIN_DATE=new Date(new GregorianCalendar(2000,Calendar.MARCH,20,0,0,0).getTime().getTime());

          protected static final int ORIGIN_WEEK_DAY=Calendar.MONDAY;
          protected static final String STANDARD_FORMAT_PATTERN="yyyy/MM/dd";

          public static final int SATURDAY=Calendar.SATURDAY;
          public static final int SUNDAY=Calendar.SUNDAY;
          public static final int MONDAY=Calendar.MONDAY;
          public static final int TUESDAY=Calendar.TUESDAY;
          public static final int WEDNESDAY=Calendar.WEDNESDAY;
          public static final int THURSDAY=Calendar.THURSDAY;
          public static final int FRIDAY=Calendar.FRIDAY;

          public static final int SHANBEH=Calendar.SATURDAY;
          public static final int YEKSHANBEH=Calendar.SUNDAY;
          public static final int DOSHANBEH=Calendar.MONDAY;
          public static final int SESHANBEH=Calendar.TUESDAY;
          public static final int CHAHARSHANBEH=Calendar.WEDNESDAY;
          public static final int PANJSHANBEH=Calendar.THURSDAY;
          public static final int JOMEH=Calendar.FRIDAY;

        ...

    public ShamsiCalendar() {
      }

      public static Date sysDate()
      {
        return new Date(System.currentTimeMillis());
      }

     public static long millisToDay(long millis )
      {
        return (long)(millis/DAY_MILLIS);
      }

     public static long dayToMillis(long day )
      {
        return day*DAY_MILLIS;
      }

      public static String weekDayName(int dd,boolean brf)  {
        String ds=new String("");

        if(brf)    {
            switch(dd){
                case SHANBEH:                return SHANBEH_TEXT;
                case YEKSHANBEH:             return SHANBEH_TEXT + " 1";
                case DOSHANBEH:              return SHANBEH_TEXT + " 2";
                case SESHANBEH:              return SHANBEH_TEXT + " 3";
                case CHAHARSHANBEH:          return SHANBEH_TEXT + " 4";
                case PANJSHANBEH:            return SHANBEH_TEXT + " 5";
                case JOMEH:                  return JOMEH_TEXT;
              }
          }
          else      {
          switch(dd){
                case SHANBEH:                return SHANBEH_TEXT;
                case YEKSHANBEH:             return YEKSHANBEH_TEXT;
                case DOSHANBEH:              return DOSHANBEH_TEXT;
                case SESHANBEH:              return SESHANBEH_TEXT;
                case CHAHARSHANBEH:          return CHAHARSHANBEH_TEXT;
                case PANJSHANBEH:            return PANJSHANBEH_TEXT;
                case JOMEH:                  return JOMEH_TEXT;
              }
            }
            return SHANBEH_TEXT + Integer.toString(dd) +"_E";
      }
...
ShamsiCalendar的java文件:

        <TD ALIGN="center" width="35%"><P CLASS="SmallBlackRemark"><font class="RedColor"><b><%=DateUtil.stringDayMountYear()%></b></font></P></TD>
        import java.util.*;

        import java.text.SimpleDateFormat;

        import java.text.ParsePosition;

        import com.fdate.*;

        public class DateUtil{

          public static String getCurrentDate()
          {
            FDate curDate = new FDate(System.currentTimeMillis());
            return curDate.toString();
          }

          public static String getCurrentTime()
          {
            FDate curDate = new FDate(System.currentTimeMillis());
            String time = curDate.getHour() + ":"+curDate.getMinute()+":"+curDate.getSecond();
            return time;
          }

          public static int getCurrentYear()
          {
            FDate curDate = new FDate(System.currentTimeMillis());
            return curDate.getYear();
          }

          public static int getCurrentMonth()
          {
            FDate curDate = new FDate(System.currentTimeMillis());
            return curDate.getMonth();
          }


          public static int getCurrentDay()
          {
            FDate curDate = new FDate(System.currentTimeMillis());
            return curDate.getDate();
          }


        //reverse the order of dd and yyyy in a farsi date string just for fixing farsi presentation problem
          //suppose that input date is in the form of yyyy/mm/dd
          //the output would be as dd/mm/yyyy

          public static String stringDayMountYear(){
            return ShamsiCalendar.weekDayName(ShamsiCalendar.dayOfWeek(DateUtil.getCurrentDate()))+ " "+
                ShamsiCalendar.monthDayName(DateUtil.getCurrentDay())+
                ShamsiCalendar.monthName(DateUtil.getCurrentMonth()) +""  +
                String.valueOf(DateUtil.getCurrentYear());
          }

        }
        package com.fdate;

        import java.util.*;
        import java.text.*;

        public class ShamsiCalendar
        {
          protected static final TimeZone DEFAULT_TIMEZONE=TimeZone.getDefault();
          protected static final long DAY_MILLIS=1000*60*60*24;
          protected static final int HOUR_MILLIS=1000*60*60;
          protected static final int MINUTE_MILLIS=1000*60;
          protected static final String SH_ORIGIN_DATE="1379/01/01";
          protected static final int TIMEZONE_RAW_OFFSET=DEFAULT_TIMEZONE.getRawOffset();

          protected static final int TIMEZONE_RAW_OFFSET_HOUR=TIMEZONE_RAW_OFFSET/HOUR_MILLIS;

          protected static final int TIMEZONE_RAW_OFFSET_MINUTE=(TIMEZONE_RAW_OFFSET-(HOUR_MILLIS*TIMEZONE_RAW_OFFSET_HOUR))/MINUTE_MILLIS;

        //  protected static final Date MI_ORIGIN_DATE=new Date(new GregorianCalendar(2000,Calendar.MARCH,20,0,0,0).getTimeInMillis());

          protected static final Date MI_ORIGIN_DATE=new Date(new GregorianCalendar(2000,Calendar.MARCH,20,0,0,0).getTime().getTime());

          protected static final int ORIGIN_WEEK_DAY=Calendar.MONDAY;
          protected static final String STANDARD_FORMAT_PATTERN="yyyy/MM/dd";

          public static final int SATURDAY=Calendar.SATURDAY;
          public static final int SUNDAY=Calendar.SUNDAY;
          public static final int MONDAY=Calendar.MONDAY;
          public static final int TUESDAY=Calendar.TUESDAY;
          public static final int WEDNESDAY=Calendar.WEDNESDAY;
          public static final int THURSDAY=Calendar.THURSDAY;
          public static final int FRIDAY=Calendar.FRIDAY;

          public static final int SHANBEH=Calendar.SATURDAY;
          public static final int YEKSHANBEH=Calendar.SUNDAY;
          public static final int DOSHANBEH=Calendar.MONDAY;
          public static final int SESHANBEH=Calendar.TUESDAY;
          public static final int CHAHARSHANBEH=Calendar.WEDNESDAY;
          public static final int PANJSHANBEH=Calendar.THURSDAY;
          public static final int JOMEH=Calendar.FRIDAY;

        ...

    public ShamsiCalendar() {
      }

      public static Date sysDate()
      {
        return new Date(System.currentTimeMillis());
      }

     public static long millisToDay(long millis )
      {
        return (long)(millis/DAY_MILLIS);
      }

     public static long dayToMillis(long day )
      {
        return day*DAY_MILLIS;
      }

      public static String weekDayName(int dd,boolean brf)  {
        String ds=new String("");

        if(brf)    {
            switch(dd){
                case SHANBEH:                return SHANBEH_TEXT;
                case YEKSHANBEH:             return SHANBEH_TEXT + " 1";
                case DOSHANBEH:              return SHANBEH_TEXT + " 2";
                case SESHANBEH:              return SHANBEH_TEXT + " 3";
                case CHAHARSHANBEH:          return SHANBEH_TEXT + " 4";
                case PANJSHANBEH:            return SHANBEH_TEXT + " 5";
                case JOMEH:                  return JOMEH_TEXT;
              }
          }
          else      {
          switch(dd){
                case SHANBEH:                return SHANBEH_TEXT;
                case YEKSHANBEH:             return YEKSHANBEH_TEXT;
                case DOSHANBEH:              return DOSHANBEH_TEXT;
                case SESHANBEH:              return SESHANBEH_TEXT;
                case CHAHARSHANBEH:          return CHAHARSHANBEH_TEXT;
                case PANJSHANBEH:            return PANJSHANBEH_TEXT;
                case JOMEH:                  return JOMEH_TEXT;
              }
            }
            return SHANBEH_TEXT + Integer.toString(dd) +"_E";
      }
...
FDate的java文件:

package com.fdate;

import java.util.*;
import java.text.*;

public class FDate
{
  protected static final long DAY_MILLIS=1000*60*60*24;
  protected static final int HOUR_MILLIS=1000*60*60;
  protected static final int MINUTE_MILLIS=1000*60;

  protected Date internalDate;

  protected String internalShamsiDate;

  public FDate(long millis) {
    set(millis);
  }

 public FDate(){
    set();
  }

  public FDate(int year, int month, int date) {
    set(year,month,date);
  }

  public FDate(String shDate) {
    set(shDate);
  }

public String composite(int year , int month , int date){
    String ys;
    String ms;
    String ds;
    DecimalFormat df=new DecimalFormat();
    df.applyPattern("0000");
    ys=df.format(year);
    df.applyPattern("00");
    ms=df.format(month);
    df.applyPattern("00");
    ds=df.format(date);
    return ys + "/" + ms + "/" + ds;
  }

 public int getField(int field){
    GregorianCalendar gc=new GregorianCalendar();
    gc.setTime(internalDate);
    return gc.get(field);
  }

  public void setField(int field, int newValue){
    GregorianCalendar gc=new GregorianCalendar();
    gc.setTime(internalDate);
    gc.set(field,newValue);
    internalDate=gc.getTime();
  }

  public void set(){
    internalDate=new Date();
    internalShamsiDate=ShamsiCalendar.miladiToShamsi(internalDate);
  }

  public void set(int year, int month, int date) {
    internalDate=ShamsiCalendar.shamsiToMiladi(composite(year,month,date));
    internalShamsiDate=ShamsiCalendar.miladiToShamsi(internalDate);
  }

public void set(String shDate) {
    internalDate=ShamsiCalendar.shamsiToMiladi(shDate);
    internalShamsiDate=ShamsiCalendar.miladiToShamsi(internalDate);
  }

public void setTime(int hrs,int min){
    setField(Calendar.HOUR_OF_DAY,hrs);
    setField(Calendar.MINUTE,min);
  }

  public void setTime(int hrs,int min,int sec){
    setField(Calendar.HOUR_OF_DAY,hrs);
    setField(Calendar.MINUTE,min);
    setField(Calendar.SECOND,sec);
  }

  public int getHour(){
    return getField(Calendar.HOUR_OF_DAY);
  }

  public int getMinute(){
    return getField(Calendar.MINUTE);
  }

  public int getSecond(){
    return getField(Calendar.SECOND);
  }

 public int getYear(){
    return ShamsiCalendar.getYear(ShamsiCalendar.miladiToShamsi(internalDate));
  }

  public int getMonth(){
    return ShamsiCalendar.getMonth(ShamsiCalendar.miladiToShamsi(internalDate));
  }

  public int getDate(){
    return ShamsiCalendar.getDate(ShamsiCalendar.miladiToShamsi(internalDate));
  }

  public int dayOfWeek(){
    return getField(Calendar.DAY_OF_WEEK);
  }

  public boolean after(Date when){
    return internalDate.after(when);
  }

  public boolean after(FDate when){
    return internalDate.after(when.get());
  }

  public boolean before(Date when){
    return internalDate.before(when);
  }

  public boolean before(FDate when){
    return internalDate.before(when.get());
  }

  public void nextDay(){
    internalDate.setTime(internalDate.getTime()+DAY_MILLIS);
    internalShamsiDate=ShamsiCalendar.nextDay(internalShamsiDate);
  }

  public void prevDay(){
    internalDate.setTime(internalDate.getTime()-DAY_MILLIS);
    internalShamsiDate=ShamsiCalendar.prevDay(internalShamsiDate);
  }

  public void nextMonth(){
    internalShamsiDate=ShamsiCalendar.nextMonth(internalShamsiDate);
    internalDate=ShamsiCalendar.shamsiToMiladi(internalShamsiDate);
  }

  public void prevMonth(){
    internalShamsiDate=ShamsiCalendar.prevMonth(internalShamsiDate);
    set(ShamsiCalendar.shamsiToMiladi(internalShamsiDate),getHour(),getMinute(),getSecond());
  }

  public void nextYear(){
    internalShamsiDate=ShamsiCalendar.nextYear(internalShamsiDate);
    internalDate=ShamsiCalendar.shamsiToMiladi(internalShamsiDate);
  }


  public void prevYear(){
    internalShamsiDate=ShamsiCalendar.prevYear(internalShamsiDate);
    set(ShamsiCalendar.shamsiToMiladi(internalShamsiDate),getHour(),getMinute(),getSecond());
  }

下面是我如何处理这个问题的:

似乎您的FDate(long)构造函数偶尔会返回错误的日期。要确认或否认这一点,我会在设置完internalDate和internalShamsiDate之后,将它们发送到日志文件或标准输出,并尝试复制错误。当你重现这个bug时,看看这两个值是否是你所期望的

如果他们不是,那么你知道你的问题就存在于ShamsiCalendar.miladiToShamsi(日期)的某个地方。如果它们看起来不错,它就住在别处


我肯定会仔细看看ShamsiCalendar中的日期处理方法。它们似乎都将字符串作为输入,因此我假设代码正在处理字符串以获取所需的信息。这种方法天生容易出错;如果有一些字符串无法正确处理,或者Shamsicallendar.miladiToShamsi偶尔生成的输出与这些方法所期望的略有不同,我一点也不会感到惊讶。

用提供的信息无法回答这个问题。您没有提到日期提供的位置/方式,这是除了服务器出现问题之外的唯一其他原因。我在myWebapps中使用的日期是一个包含以下内容的java文件(import java.util.*;import java.text.simpleDataFormat;import java.text.ParsePosition)这并不能描述你是如何得到数据的。更好地订阅时间服务来同步服务器时间和宇宙。考虑使用JoDaTi而不是FDATE。看来FDate有问题)tnx!为什么要击倒和击倒雄猫,这个问题有时会得到解决?我真的不知道;它可能会清除损坏的数据?我也不知道为什么这么多年来它一直运作顺利,但现在却变得愚蠢。也许是最近的日期触发了我怀疑可能存在的字符串处理问题?我详细研究了这些方法。因此,它与服务器的时间无关。好吗?等等。“服务器。”如中所示,多个服务器?这是否在多服务器群集上运行?如果是这样,您是否已确保所有服务器都设置为正确的日期?服务器上的oracle数据库,以及另一台服务器上的webapps、earfile。我不检查服务器的时间。是否有可能服务器的时间不一致?(此外,我关闭并启动了两台服务器,因此出现了此问题)