2011-09-30 90 views
6

¿Necesita una fórmula en excel y C# para convertir los datos en formato "yyyymmdd" al formato de fecha juliana "yyJJJ"? Donde "JJJ" es la fecha juliana del día presentada. ¿Es JJJ un número de 1 a 365 o 999 o 366? No creo que sea 366, pero sí tenemos año bisiesto, así que podría ser un año bisiesto.convertir la fecha aaaammdd a yyJJJ o Julian Fecha

En Excel estoy tratando de utilizar lo siguiente:

=Year() & DAYS360("20110101","20110930") 

En C# que estoy usando ahora() para obtener la fecha actual. Pero quiero el número de días entre el 1 de enero y la fecha actual. No estoy seguro si esto es la fórmula prototipo correcta:

Prepend Two digit year format to the following 
    Number of Days between "20110101" and "20110930" in "YY" format 
+4

En .NET, 'DateTime.DayOfYear' funciona bastante bien. Para Excel, consulte http://www.cpearson.com/excel/jdates.htm –

Respuesta

11

En vez de manejar esto por sí mismo en C#, puede simplemente usar el JulianCalendar class

Y para conseguir hoy en día en el calendario juliano, que podía hacer:

JulianCalendar calendar = new JulianCalendar(); 
var today=DateTime.Today; 
var dateInJulian = calendar.ToDateTime(today.Year, today.Month, today.Day, today.Hour, today.Minute, today.Second, today.Millisecond); 

EDIT:

Y me di cuenta de que no te ayudaré con una buena manera de conseguir un buen resultado en el formato YYJJJ estabas buscando, es bastante simple:

var stringResult=string.Format("{0}{1}", dateInJulian.ToString("yy"), dateInJulian.DayOfYear); 

Por desgracia, no creo que hay una equivalente a dateTime.ToString("JJJ"); que dará el día del año, de ahí mi pequeña string.Format() solución alternativa, ¡pero funciona igual de bien!

Edit2:

Así Phoog me educó un poco por debajo en los comentarios, y señaló que no estaban buscando para hoy en el Calendario Juliano, que es lo que el código anterior podría dar respecto a la JulianCalendar clase. Por el contrario, parece que estás buscando la fecha ordinal (esta pieza se agregó para la aclaración futura del lector). Voy a dejar lo anterior para que nadie cometa el mismo error que yo. Lo que realmente quiere, creo, es el código de la primera edición pero sin el negocio JulianCalendar, por lo que:

var dateToConvert = DateTime.Today // Or any other date you want! 
var stringResult=string.Format("{0}{1}", dateToConvert.ToString("yy"), dateToConvert.DayOfYear); 
+1

¡Una respuesta tan simple, pero tal verdad también! ;-) – Tipx

+0

-1. Esto no es en absoluto lo que el OP está buscando, y de hecho, es incorrecto. Para 2011-09-30, la variable dateJulian en el ejemplo tendrá un valor de 2011-10-13. Pero el resultado correcto, dados los requisitos del afiche, es 11273 (dado que 273 es el 'DayOfYear' para 2011-09-30). – phoog

+1

@phoog Lo siento, estoy bastante seguro de que no sabes de lo que estás hablando. 273 es el día del año del calendario gregoriano, y el día del año calendario juliano es de hecho 286. Es posible que lo que el OP estaba buscando fuera el día juliano, en cuyo caso tienes razón y lo anterior es incorrecto, pero su pregunta dice Julian date que implica calendario para mí. Leyendo nuevamente la pregunta, quizás tengas razón y eso es lo que está buscando, aun así el código no es incorrecto y puede usarse fácilmente para encontrar lo que estás hablando, si sustituyes 'today' por' dateInJulian'. – Kevek

1

en C# que puede hacer

DateTime dt = DateTime.Now; 
DateTime firstJan = new DateTime(dt.Year, 1, 1); 

int daysSinceFirstJan = (dt - firstJan).Days + 1; 
+0

Gracias Bala. Pregunta rápida: ¿01/01/2011 JJJ = 001, o 000? ¿Y es 30/09/2011 JJJ = 269 o 270? thx – RetroCoder

+1

@RetroCoder No conozco el calendario juliano. En este momento, el fragmento de arriba devolverá 0 para enero 1er. si tiene que estar encendido, simplemente haga '(dt - firstJan) .Days + 1;' –

+0

¡Me encantó esta lógica y la usé yo mismo! –

5

Según estos artículos, usted debe utilizar el término "fecha ordinal" en lugar de "fecha juliana ":

http://en.wikipedia.org/wiki/Ordinal_date

http://en.wikipedia.org/wiki/Julian_day

Según la primera, la norma ISO para fecha ordinal especifica un año de 4 dígitos, y que el intervalo es de 1 a 366, por lo que primero enero es 1.

Esto, por supuesto, significa que las fechas entre marzo y diciembre tendrán dos valores posibles dependiendo de si la fecha cae en un año bisiesto.

La solución de Bala (con la opción + 1 dada en los comentarios) será suficiente.

EDITAR: La propiedad DayOfYear del tipo DateTime propia, como señaló Jim Mischel, es más simple y probablemente más rápida.

+0

Tengo que usar formato de año de dos dígitos b/c es parte de la especificación de estado. – RetroCoder

+1

Bastante justo. Luego verificaría con la fuente de la especificación para ver si prefieren usar '1' o' 0' para el primero de enero. Si eso no es posible o desaconsejable, usaría '1'. – phoog

1

Creo que lo que busca es la siguiente:

DateTime dt = DateTime.Now; 
string ordinalDate = dt.ToString("yy") + dt.DayOfYear.ToString("000"); 

Esto le dará una cadena que es siempre 5 dígitos con un día de año de dos dígitos y 3 dígitos del año. Keveks answer le dará una cadena que podría tener 3, 4 o 5 dígitos.

Cuestiones relacionadas