2010-03-01 26 views
6

estoy trabajando en un algoritmo en C# para calcular un pasado DateTime basado en una cadena de entrada con las siguientes características:Cálculo de fecha y hora pasado en C#

La cadena contiene un número entero seguido de 'D', 'M' o 'Y', como "1D" o "90M".

La salida será DateTime.Now menos el número correspondiente de días, meses o años.

El problema que estoy teniendo es que, por ejemplo, cambio la cadena de entrada en un Regex (D, M o Y) y restar el TimeSpan correspondiente de DateTime.Now, el nuevo constructor TimeSpan() no acepta meses o años, solo días.

if (new Regex(@"[0-9]+D").IsMatch(value)) 
{ 
    newDate = DateTime.Now - TimeSpan(Int32.Parse(value.Replace("D", "")), 0, 0); 
} 

Esta lógica está bien si la cadena de entrada es de día, pero el constructor para TimeSpan no acepta meses o años, y sería muy inexacta si asumido cada mes tenía 30 días, o cada año tenía 365 dias.

¿Alguien tiene ideas sobre cómo implementar este algoritmo?

Gracias!

+0

¿Tiene alguna idea sobre cómo implementarla? Porque hasta ahora, su técnica parece: "pregúntale a SO y quizás alguien lo haga por mí". Cuéntanos lo que has intentado ya! –

Respuesta

15

DateTime tiene AddMonths, AddDays y AddYears métodos. Úselos con el signo menos para sustraer

+0

Método más razonable y fácil de hacer esto –

+0

Por alguna razón tremendamente horrible, pensé que tenía que usar un método de Restar Días, etc. para hacerlo. Resulta que agregar negativos tiene el mismo efecto. Puede que tenga que volver a tomar un curso básico de álgebra ... ¡¡¡TY !!! –

0

Para restar meses, creo un nuevo DateTime y simplemente evalúo mes/año. Entonces 1/2010 - 6 meses sería 6/2010 ... una vez que tenga el mes/año establecido, puede ver el componente original de fecha/hora y asegurarse de que se ajuste dentro del mes.

Eso es lo que hice. El año fue evaluado de la misma manera. Restar días es fácil; usa el componente TimeSpan para hacerlo.

3

¿No podría preferir usar el AddDays/AddMonths/AddYears pero con números negativos?

De DateTime.AddDays Method

El parámetro valor puede ser negativo o positivo.

Y luego tal vez solo implemente una posición de interruptor para aplicar el método Add apropiado.

0

Recuerde que usted puede agregar cantidades negativas también y echa un vistazo a this method y this one.

Cuestiones relacionadas