Ir para conteúdo
  • Cadastre-se

dev botao

  • Este tópico foi criado há 2899 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Boa noite amigos, estou inserindo a data de inicio e de final do movimento do sped fiscal fazendo uso do acbrframework com o Jacbr mas a data está diminuindo um dia exemplo se eu selecionar dia 01122016 no arquivo aparece 30112016 :/

Alguém já passou por isso ?

 

//Classe OleDate do JAcbr

package jACBrFramework;

//<editor-fold defaultstate="collapsed" desc="Disclaimer">
// OleDate.java
//
// Written by Sridhar S Madhugiri
// of Microsoft Technical Support, Developer Support
// Copyright (c) 1997 Microsoft Corporation. All rights reserved.
//
// this class extends Date to convert support Conversion from/to
// OLE Data type DATE
//
// OleData type DATE is actually represented as a double.
//
// To convert from DATE to Date call the setDate(double) member.
// This function does not do a lot of error checking about valid ranges.
// It converts the value passed in to year, month, date, hour,
// minute, second and calls the Date functions to set the values in
// the object.
//
// To convert from Date to DATE call toDouble() member. This returns
// a double that has the date value in the correct format.
//
// http://support.microsoft.com/kb/169795
//</editor-fold>
import java.util.Calendar;
import java.util.Date;

@SuppressWarnings({"unused", "deprecation"})
public class OleDate extends Date {
    //<editor-fold defaultstate="collapsed" desc="Fields">

    // source code copied from MFC 4.21 and modified
    private static double HALF_SECOND = (1.0 / 172800.0);

    // source code copied from MFC 4.21 and modified
    private static int rgMonthDays[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};

    //</editor-fold>
    //<editor-fold defaultstate="collapsed" desc="Constructor">
    public OleDate(Date date) {
        super(date.getTime());
    }

    public OleDate(double date) {
        setDate(date);
    }

    //</editor-fold>
    //<editor-fold defaultstate="collapsed" desc="Methods">
    //<editor-fold defaultstate="collapsed" desc="Static Methods">
    public static double toOADate(Date date) {
        if (date == null) {
            return 0d;
        }
        OleDate oleDate = new OleDate(date);
        return oleDate.toDoubles();
    }

    public static Date fromOADate(double value) {
        OleDate oleDate = new OleDate(value);
        return oleDate.toDates();
    }

    //</editor-fold>
    //<editor-fold defaultstate="collapsed" desc="OleDate Conversion Methods">
    @SuppressWarnings("empty-statement")
    private void setDate(double dtSrc) {
        // source code copied from MFC 4.21 and modified
        long nDaysAbsolute; // Number of days since 1/1/0
        long nSecsInDay; // Time in seconds since midnight
        long nMinutesInDay; // Minutes in day
        long n400Years; // Number of 400 year increments since 1/1/0
        long n400Century; // Century within 400 year block (0,1,2 or 3)
        long n4Years; // Number of 4 year increments since 1/1/0
        long n4Day; // Day within 4 year block
        // (0 is 1/1/yr1, 1460 is 12/31/yr4)
        long n4Yr; // Year within 4 year block (0,1,2 or 3)
        boolean bLeap4 = true; // TRUE if 4 year block includes leap year

        // values in terms of year month date.
        int tm_sec;
        int tm_min;
        int tm_hour;
        int tm_mday;
        int tm_mon;
        int tm_year;

        double dblDate = dtSrc; // temporary serial date
        // If a valid date, then this conversion should not overflow

        // Round to the second
        dblDate += ((dtSrc > 0.0) ? HALF_SECOND : -HALF_SECOND);
        // Add days from 1/1/0 to 12/30/1899
        nDaysAbsolute = (long) dblDate + 693959L;
        dblDate = Math.abs(dblDate);
        nSecsInDay = (long) ((dblDate - Math.floor(dblDate)) * 86400.);
        // Leap years every 4 yrs except centuries not multiples of 400.
        n400Years = nDaysAbsolute / 146097L;
        // Set nDaysAbsolute to day within 400-year block
        nDaysAbsolute %= 146097L;
        // -1 because first century has extra day
        n400Century = (nDaysAbsolute - 1) / 36524L;
        // Non-leap century
        if (n400Century != 0) {
            // Set nDaysAbsolute to day within centurY
            nDaysAbsolute = (nDaysAbsolute - 1) % 36524L;
            // +1 because 1st 4 year increment has 1460 days
            n4Years = (nDaysAbsolute + 1) / 1461L;
            if (n4Years != 0) {
                n4Day = (nDaysAbsolute + 1) % 1461L;
            } else {
                bLeap4 = false;
                n4Day = nDaysAbsolute;
            }
        } else {
            // Leap century - not special case!
            n4Years = nDaysAbsolute / 1461L;
            n4Day = nDaysAbsolute % 1461L;
        }
        if (bLeap4) {
            // -1 because first year has 366 days
            n4Yr = (n4Day - 1) / 365;
            if (n4Yr != 0) {
                n4Day = (n4Day - 1) % 365;
            }
        } else {
            n4Yr = n4Day / 365;
            n4Day %= 365;
        }
        tm_year = (int) (n400Years * 400 + n400Century * 100 + n4Years * 4 + n4Yr);
        // Handle leap year: before, on, and after Feb. 29.
        if (n4Yr == 0 && bLeap4 && n4Day == 59) {
            /* Feb. 29 */
            tm_mon = 2;
            tm_mday = 29;
        } else {
            if (n4Yr == 0 && bLeap4 && n4Day >= 59) {
                --n4Day;
            }
            // Make n4DaY a 1-based day of non-leap year and compute
            // month/day for everything but Feb. 29.
            ++n4Day;
            // Month number always >= n/32, so save some loop time */
            for (tm_mon = (int) ((n4Day >> 5) + 1); n4Day > rgMonthDays[tm_mon]; tm_mon++);
            tm_mday = (int) (n4Day - rgMonthDays[tm_mon - 1]);
        }

        if (nSecsInDay == 0) {
            tm_hour = tm_min = tm_sec = 0;
        } else {
            tm_sec = (int) (nSecsInDay % 60L);
            nMinutesInDay = nSecsInDay / 60L;
            tm_min = (int) (nMinutesInDay % 60);
            tm_hour = (int) (nMinutesInDay / 60);
        }
        Calendar c = Calendar.getInstance();
        c.set(Calendar.YEAR, tm_year);
        c.set(Calendar.MONTH, tm_mon - 1);
        c.set(Calendar.DAY_OF_MONTH, tm_mday);
        c.set(Calendar.HOUR_OF_DAY, tm_hour);
        c.set(Calendar.MINUTE, tm_min);
        c.set(Calendar.SECOND, tm_sec);
        setTime(c.getTime().getTime());
//        setYear(tm_year - 1900);
//        setMonth(tm_mon - 1);
//        super.setDate(tm_mday); // resolves ambiguity
        // between OleDate.setDate and
        // java.util.Date.setDate
//        setHours(tm_hour);
//        setMinutes(tm_min);
//        setSeconds(tm_sec);
    }
//</editor-fold>

    public Date toDates() {
        Date date = new Date();
        date.setTime(this.getTime());
        return date;
    }

    public double toDoubles() {
        // source code copied from MFC 4.21 and modified.
        Calendar c = Calendar.getInstance();
        c.setTime(this);
        int wYear = c.get(Calendar.YEAR);
        int wMonth = c.get(Calendar.MONTH);
        int wDay = c.get(Calendar.DAY_OF_MONTH);
        int wHour = c.get(Calendar.HOUR_OF_DAY);
        int wMinute = c.get(Calendar.MINUTE);
        int wSecond = c.get(Calendar.SECOND);
        //  Check for leap year and set the number of days in the month
        boolean bLeapYear = ((wYear & 3) == 0) && ((wYear % 100) != 0 || (wYear % 400) == 0);
        // Cache the date in days and time in fractional days
        long nDate;
        double dblTime;
        //It is a valid date; make Jan 1, 1AD be 1
        nDate = wYear * 365L + wYear / 4 - wYear / 100 + wYear / 400 + rgMonthDays[wMonth - 1] + wDay;
        //  If leap year and it's before March, subtract 1:
        if (wMonth >= 2 && bLeapYear) {
            --nDate;
        }

        //  Offset so that 12/30/1899 is 0
        nDate -= 693959L;

        dblTime = (((long) wHour * 3600L)
                + // hrs in seconds
                ((long) wMinute * 60L)
                + // mins in seconds
                ((long) wSecond)) / 86400.;

        double dtDest = (double) nDate
                + ((nDate >= 0) ? dblTime : -dblTime);

        return dtDest;
    }
}

 

Sped Fiscal 20122016.txt

Willian Resplandes Matias

Skype: willian.matias.frialto

Postado

Resolvido, altere o trecho do código que faz a verificação para o trecho abaixo.

 

//Mudando somente a comparação que era >= para <=
if (wMonth <= 2 && bLeapYear) {
            --nDate;
        }

 

Willian Resplandes Matias

Skype: willian.matias.frialto

  • Este tópico foi criado há 2899 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.