2011-12-02 15 views
23

Quiero obtener una estructura Timespan que represente un año en C#.¿Cómo obtener un Timespan de 1 año?

+2

[TimeSpan] (http://msdn.microsoft.com/en-us/library/system.timespan.aspx) es una estructura, no un objeto :-) –

+1

año bisiesto, año normal o año promedio? –

+1

Esta pregunta lleva a una buena discusión +1 – Matt

Respuesta

33

Lo complicado es que lo que un año es, depende de dónde comienza.

Usted puede hacer

DateTime now = DateTime.Now; 
TimeSpan span = now.AddYears(1) - now; 

Esto le daría la 1 year timespan desde el momento actual hasta un año después

+0

sehe es correcto, un intervalo de tiempo de un año será único para cada punto de inicio. –

+0

genial, gracias, pero ¿podría agregar algunos ejemplos de cómo se comporta? ¿Por qué es importante que 1 año de duración depende de dónde comienza? ahora mismo no puedo imaginar dónde podría estar el problema, pero sé que tiene que estar en algún lugar :) gracias – Zavael

+1

oh ahora me di cuenta, ¿por qué cuando agrego 1 año como en esta respuesta y luego obtengo el XmlConvert.ToString (span) siempre hace días del año ... Quiero una salida como PnYnMnDnHnMnS ... y siempre hace PnDnH ... los años y meses no están presentes ¿por qué? – Zavael

2

No puede, como un año no tiene una longitud fija (¿es 365 o 366 días o aproximadamente 365.25?). Por eso también no se puede tener un mes como TimeSpan (28, 29, 30, 31 días ??)

+4

y olvidando los segundos intercalares y otras anomalías para ... segundo ... hay – sehe

+0

@BoltClock: sí, Hans usó uno de sus segundos de repuesto para editar ninja eso en :) – sehe

+0

@sehe: entonces eso es lo que llamas rápido edite sin que se muestre como uno solo, ¡genial! – leppie

2
DateTime intialDate = Date.Now.Date; 
TimeSpan yearSpan = intialDate.AddYears(1).Subtract(intialDate) 

Como otros peoplehave mencionados es posible que desee tener en cuenta los años bisiestos. En ese caso, puede iniciar intialDate en consecuencia.

2

ejemplo áspera:

TimeSpan oneYearSpan = new TimeSpan(365, 0, 0, 0); 

hará esto?

+2

Y si es un leapyear? –

+0

¡Lo sé! :) Por eso es un ejemplo áspero. Mi voto es para sehe. – Nayan

0

Depende del año que desee representar, ya que no todos los años tienen la misma duración.

Esta es la manera de encontrar la longitud del año 2010, por ejemplo:

var timestamp = new DateTime(2011, 1, 1) - new DateTime(2010, 1, 1); 

cambiar el año en el DateTimes para encontrar la longitud del año que desee.

1

La pregunta clave aquí es: ¿qué año?

La duración del período de tiempo obviamente depende de si el año que desea es un año bisiesto o no y cuándo comienza.

Si quiere un año a partir de hoy, vaya con la respuesta de @ sehe.

Si desea que el movimiento actual año con @Oyvind,

Si desea una aproximación razonable se puede ir con @Nayan, o para una utilización 365.25 aproximación:

TimeSpan oneYearSpan = new TimeSpan(365, 6, 0, 0); 
0

Aquí está cómo hacerlo esto, utilizando el IsLeapYear para determinar el número de días.

int span = DateTime.IsLeapYear(1996) ? 366: 365; 
var year1996 = new TimeSpan(span, 0, 0, 0); 
+0

No todos los períodos que duran en eyear comienzan el 1 de enero. No lo hagas así – oerkelens

1

Si quiere ser bastante preciso, puede usar la cantidad de nano segundos en un año. Creo que esto se mueve por 0.5 segundos cada siglo, ¡así que debería ser bueno durante mucho tiempo todavía!

public TimeSpan MyYear 
{ 
    get 
    { 
     // Year = 3.1556926 × 10^16 nanoseconds 
     return new TimeSpan(31556926000000000); 
    } 
} 

ya hay algunas buenas respuestas en esta página, esto es sólo otra opción.

+1

Y en un año bisiesto, tiene un día completo libre de lo que las personas más mojadas esperarían. No es una idea de dios – oerkelens