Bienvenido(a), Visitante. Favor de ingresar o registrarse.
Diciembre 05, 2008, 09:57:17
Inicio Ayuda Buscar Ingresar Registrarse
Noticias: Foro de Java, C++ y más.

Empieza una nueva comunidad de programación: Oneble ... es lo que tu quieras que sea

+  Foros Java y C/Linux
|-+  Programación
| |-+  Java J2SE
| | |-+  Todo tipo de operaciones con fecha
« anterior próximo »
Páginas: [1] 2 Enviar tema Imprimir
Autor Tema: Todo tipo de operaciones con fecha  (Leído 1365 veces)
Daniel
Newbie
*
Mensajes: 48



Ver Perfil Email


« en: Octubre 24, 2007, 07:49:57 »

Hola a todos
un saludo jafe

Bueno estoy intentando hacer un programa que haga todo tipo de operaciones con fechas.-
Aquí les dejo el programa para que me digan como puedo solucionar el error.-
***********************************
package echoPorDaniel;

import java.io.*;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;

public class operacionesConFechas
{
    public static void main(String[] args) throws IOException
    {
        new operacionesConFechas();
    }
     public operacionesConFechas() throws IOException
    {
        int largo = 0;
        BufferedReader fe_cha = new BufferedReader(new InputStreamReader(System.in));
        BufferedReader fecha  = new BufferedReader (fe_cha);
        BufferedReader dias = new BufferedReader(new InputStreamReader(System.in));
        BufferedReader diasAgRe = new BufferedReader(dias);
        Calendar cal = Calendar.getInstance();
        cal.setTimeZone(TimeZone.getDefault());
        DateFormat formatoFecha = DateFormat.getDateInstance(DateFormat.FULL);
        SimpleDateFormat formatea = new SimpleDateFormat("dd/MM/yyyy");
        System.out.println("Hoy es: " + formatoFecha.format(new Date()));
        System.out.println("---------------------------------------");
        System.out.println("Ingrese una fecha ej.'18/01/1952' ");
        String validaFecha = fecha.readLine();
        String fechaAs = (validaFecha.toString().trim());
        try
        {
            formatea.setLenient(false);
            Date fechaForm = formatea.parse(fechaAs);
            System.out.println("Ingresaste: " + formatoFecha.format(fechaForm));
            System.out.println("---------------------------------------");
            System.out.println("Ingresa la cantidad de dias (+35 incrementa -35 decrementa)");
            String ingdias = diasAgRe.readLine();
            String signo_Dias = (ingdias.toString().trim());
            if(signo_Dias.length() > 1)
            {
                String signoDias=ingdias.substring(0,1);
                if(signo_Dias.equals("+") || signo_Dias.equals("-"))
                {
                    largo = signo_Dias.length();
                    String totalDias = ingdias.substring(1,largo);
                    int numero = Integer.parseInt(totalDias.trim());
                    fecha_Form.add(cal, numero); //-> no logro la sint. correcta
                }
                    else
                    System.out.println("ingreso incorrecto...");
            }
        }
        catch (ParseException e)
        {
           System.out.println("Error, la cadena de texto no se puede convertir en fecha.");
        }
     }
}
***********************************
un gran abrazo
Daniel Sonrisa
En línea
chuidiang
Administrator
Hero Member
*****
Mensajes: 1985



Ver Perfil WWW Email
« Respuesta #1 en: Octubre 24, 2007, 08:00:58 »

Hola:

¿Qué es fecha_Form y qué pretendes que haga?

Se bueno.
En línea

Daniel
Newbie
*
Mensajes: 48



Ver Perfil Email
« Respuesta #2 en: Octubre 24, 2007, 08:15:43 »

Hola
"fecha_Form" es una nueva fecha a la ingresada sumándole o restándole
una cantidad determinada de días.-
Le falta "signo_Dias" que es el signo "+" o "-" para incrementar o decrementar pero me hice tal barullo que decidí preguntar.-

Espero que se entienda.-

un gran abrazo
Daniel Sonrisa
En línea
chuidiang
Administrator
Hero Member
*****
Mensajes: 1985



Ver Perfil WWW Email
« Respuesta #3 en: Octubre 24, 2007, 09:40:48 »

Hola:

La clase Calendar tiene un método add() en el que puedes sumar o restar lo que quieras. Por ejemplo

Código:
Calendar c = new Calendar();
c.setTime(new Date());  // fecha actual
c.add(Calendar.DAY_OF_MONTH, -5)

restaría 5 días a la fecha actual. Supongo que Calendar es lo suficientemente listo como si es día 1 pasarte al veintitantos del mes anterior.

Se bueno.
En línea

Daniel
Newbie
*
Mensajes: 48



Ver Perfil Email
« Respuesta #4 en: Octubre 25, 2007, 03:57:39 »

Hola

c.add(Calendar.DAY_OF_MONTH, -5)
lo único que me falta es reemplazar "c" con una fecha
ingresada por teclado.-

haber si puedo ser un poco mas conciso y claro

Calendar hoy = Calendar.getInstance();
int masDias=20, masMeses=5, masAnos=1;
esto funciona.....:hoy.add(Calendar.DATE,  masDias);
                            hoy.add(Calendar.MONTH, masMeses);
                            hoy.add(Calendar.YEAR, masAnos);
***********************************************
//"fechaAs" es una fecha "String" ingresada por teclado
Date fechaForm = formatea.parse(fechaAs);
esto no funciona:         fechaForm.add(Calendar.DAY_OF_MONTH, 5);

El error debería estar en fechaForm pero........
************************************************
un gran abrazo
Daniel Sonrisa
En línea
chuidiang
Administrator
Hero Member
*****
Mensajes: 1985



Ver Perfil WWW Email
« Respuesta #5 en: Octubre 25, 2007, 06:05:54 »

Hola:

Date no tiene método add(), debes hacerlo con Calendar.

Para meter en Calendar una fecha de teclado, Calendar tiene muchos método set(). Puedes pasarle año, mes, mes, día, hora, minutos y segundos todos juntos en un solo método o por separado, de uno en uno, según lo hayas recogido del teclado. También puedes pasarle un setTime(Date).

Se bueno.
En línea

Daniel
Newbie
*
Mensajes: 48



Ver Perfil Email
« Respuesta #6 en: Octubre 25, 2007, 07:29:06 »

Un saludo a todos
Hola chuidiang

gracias a tú aporte e logrado resolver lo de
agregar o restar dia(s),mes(es),año(s) a fecha
ingresada por teclado, solo me falta un paso mas
para seguir adelante.-
---------------------------------------------------------- -
Ingreso por teclado:-30 //resta 30 días a la fecha
                                // también ingresada por teclado
String ingdias = diasAgRe.readLine();
String signo_Dias = (ingdias.toString().trim());
String signoDias=signo_Dias.substring(0,1);
aux.add(Calendar.DAY_OF_MONTH,-numero);

lo que necesito es remplazar el signo menos ingresado
en este caso a mano, con la variable "signoDias".-
---------------------------------------------------------- -

un gran abrazo
Daniel
En línea
Daniel
Newbie
*
Mensajes: 48



Ver Perfil Email
« Respuesta #7 en: Octubre 28, 2007, 04:54:41 »

Hola a todos
un saludo jefe
Bueno al fin solucionado todo lo anterior, ahora lo que deseo saber es como reemplazar "DATE" "MONTH" "YEAR" con la variable "diaMesAño".-
Si bien el if lo podría haber implementado de otra manera quiero saber
como se hace esto porque me será de mucha utilidad en el futuro.-

--------------------------------------------------------
.................
GregorianCalendar aux = new GregorianCalendar();

System.out.println("Ingresa la cantidad de dias (35 incrementa -35      decrementa)");
String ingdias = diasAgRe.readLine();
String signo_Dias = (ingdias.toString().trim());
int numeroConSigno = Integer.parseInt(signo_Dias.trim());
aux.setTime(fechaForm) ;                   

System.out.println("Ingresa D para(dia(s)) M para(mes(es) A para(año(s)))");
String identificador = ingI_dent.readLine();

if(identificador.equals("D"))
    diaMesAño = "DATE";
else if(identificador.equals("M"));
    diaMesAño = "MONTH";
else if(identificador.equals("A"));
    diaMesAño = "YEAR";

aux.add(Calendar.diaMesAño,numeroConSigno);
fechaForm = aux.getTime();
System.out.println("nueva fecha:" + formatoFecha.format(fechaForm));
--------------------------------------------------------

un gran abrazo
Daniel Sonrisa
En línea
chuidiang
Administrator
Hero Member
*****
Mensajes: 1985



Ver Perfil WWW Email
« Respuesta #8 en: Octubre 28, 2007, 06:17:47 »

Hola:

Puedes hacer otro if. De todas formas, si no necesitas el "DATE", "MONTH" y "YEAR" es mejor hacerlo todo de golpe. Si te fijas en la API de Calendar, verás que Calendar.DATE, Calendar.MONTY y Calendar.YEAR son enteros. Puedes hacerlo así

Código:
int diaMesAño;

if(identificador.equals("D"))
    diaMesAño = Calendar.DATE
else if(identificador.equals("M"));
    diaMesAño = Calendar.MONTH;
else if(identificador.equals("A"));
    diaMesAño = Calendar.YEAR;

aux.add(diaMesAño, numeroConSigno);
En línea

Daniel
Newbie
*
Mensajes: 48



Ver Perfil Email
« Respuesta #9 en: Octubre 30, 2007, 04:51:02 »

Hola a todos
un saludo  chuidiang

Me podrían decir como hacer para que el patrón sea case insensitive
Pattern pat = Pattern.compile("^[d|D|m|M|a|A]");

y si hay alguna manera de mejorar estas exp. regulares

un gran abrazo
Daniel Sonrisa
En línea
chuidiang
Administrator
Hero Member
*****
Mensajes: 1985



Ver Perfil WWW Email
« Respuesta #10 en: Octubre 30, 2007, 06:41:00 »

Hola:

Puedes quitar los |
Se suele usar para hacer un OR de expresiones más complejas. Si simplemente quieres una secuencia de posibles caracteres o caracteres prohibidos, como en tu caso, no es necesario. El ^ va dentro del corchete

[^dDmMaA]

si lo que quieres es que no sea ni d, ni D, ni m, ni M, ni a, ni A.

En cuanto a ignorar mayúsculas y minúsculas, tienes un método compile() que admite flags, entre ellos el de CASE_INSENSITIVE.

Código:
Pattern pat = Pattern.compile("[^dma]", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);

Lo del UNICODE_CASE es porque en la API veo que puede haber problemas con la codificación de caracteres. Prueba a ponerlo y no ponerlo a ver con qué opción te va bien.

Ojo, no he probado, hablo por lo que recuerdo y veo en la API. Quizás me haya equivocado en algo.

Se bueno.
En línea

Daniel
Newbie
*
Mensajes: 48



Ver Perfil Email
« Respuesta #11 en: Noviembre 02, 2007, 05:01:04 »

Hola a todos
un saludo chuidiang

Es probable que me merezca un tirón de orejas por esto pero me animo porque por mas que pruebo no logro implementar el programa para establecer la diferencia de días entre dos fechas.-


Código:
package echoPorDaniel;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class sumResFechas
{
        public static void main(String [] args) throws IOException
    {
        new sumResFechas();   
    }
    public sumResFechas() throws IOException
           
    {
        Calendar cal = Calendar.getInstance();
        cal.setTimeZone(TimeZone.getDefault());
        SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
        BufferedReader fe_cha = new BufferedReader(new InputStreamReader(System.in));
        BufferedReader fechaUno = new BufferedReader(fe_cha);
        BufferedReader f_echa = new BufferedReader(new InputStreamReader(System.in));
        BufferedReader fechaDos = new BufferedReader(f_echa);
        System.out.println("*************** Diferencia en dias entre 2 fechas ******"
                + "*********");
        System.out.println("Ingresa una fecha:");
        String priFecha = fechaUno.readLine();
        try
        {
            String p_Fecha = (priFecha.toString().trim());
            formato.setLenient(false);
            Date fecha_pri_Form = formato.parse(p_Fecha);
            try
            {
                System.out.println("Ingresa otra fecha:");
                String segFecha = fechaDos.readLine();
                String s_Fecha = (segFecha.toString().trim());
                formato.setLenient(false);
                Date fecha_seg_Form = formato.parse(s_Fecha);               
                //long difMiliseg = fecha_pri_Form.getTimeInMillis()
                //- fecha_seg_Form.getTimeInMillis();
                //long difDias = difMiliseg/(24*60*60*1000);
            }       
            catch (ParseException ex)
            {
                 System.out.println("Error, la cadena de texto no se puede convertir en fecha.");               
            }
        }   
        catch (ParseException ex)
        {
            System.out.println("Error, la cadena de texto no se puede convertir en fecha.");           
        }   
    }       
}

Espero que me puedan ayudar ya que es de vital importancia
para proseguir aprendiendo a programar en java.-
Desde ya muchas gracias

un gran abrazo
Daniel Sonrisa
En línea
chuidiang
Administrator
Hero Member
*****
Mensajes: 1985



Ver Perfil WWW Email
« Respuesta #12 en: Noviembre 02, 2007, 07:23:26 »

Hola:

Supongo que el problema es el  método para obtener los milisegundos. Prueba con fecha.getTime().

Se bueno.
En línea

Daniel
Newbie
*
Mensajes: 48



Ver Perfil Email
« Respuesta #13 en: Noviembre 02, 2007, 03:06:28 »

Hola  chuidiang
Muchas gracias ya legre implementarlo

Código:
................
long tiempo = fecha_seg_Form.getTime() - fecha_pri_Form.getTime();
long cant_dias = tiempo/(3600*24*1000);
System.out.println("Diferencia " + cant_dias + " Dias");
.................

Ahora me surge el siguiente inconveniente:
un int me sirve para obtener la cantidad de días pero si lo pongo
me da el error:"posible perdida de precisión" y no me deja
compilar.-
Hay alguna manera de de solucionar esto, para no utilizar memoria
innesesaria...?

un gran abrazo
Daniel Sonrisa
En línea
chuidiang
Administrator
Hero Member
*****
Mensajes: 1985



Ver Perfil WWW Email
« Respuesta #14 en: Noviembre 02, 2007, 10:00:30 »

Hola:

En vez de int usa long, eso no debería dar problemas. Para asegurar, en los números ponles una L detrás. 3600 es un int, 3600L es un long.

Puedes forzar la conversión así

int valor = (int)unLong;

pero como advierte el error, puedes perder precisión, sobre todo si trabajas con fechas en milisegundos, ya que son números muy grandes que quizás no quepan en un int.

Se bueno.
En línea

Páginas: [1] 2 Enviar tema Imprimir 
« anterior próximo »
Ir a:  


Ingresar con nombre de usuario, contraseña y duración de la sesión

Powered by MySQL Powered by PHP Powered by SMF 1.1.5 | SMF © 2006-2007, Simple Machines LLC XHTML 1.0 válido! CSS válido!