Comment convertir en vb.net une date Julian en une date normal et vice versa ?
Exemple: 95001 ----> 1/1/1995
Merci
Version imprimable
Comment convertir en vb.net une date Julian en une date normal et vice versa ?
Exemple: 95001 ----> 1/1/1995
Merci
Je ne pense pas que ce format ait quoi que ce soit à voir avec le calendrier Julien...
D'où sort cette valeur (95001) ? Comment est définie la conversion entre ce format et une date ?
A priori je dirais que les 2 premiers digits représentent l'année et les 3 derniers, le numéro du jour dans l'année.
Je connais pas ce format non plus, mais la reflexion de griftou semble des plus logique.
Bonjour,
La date julian est sous la forme de CYYDDD avec:
C=1 si l'année>2000 et = 0 si l'année<1999
YY:l'année de la date sur 2 digit
DDD:le jour de l'année sur 3digit [001<=DDD<=365(or366)
mais le probléme c'est comment je peux traiter cette fonction en vb.net
Merci
Bah c'est pas très compliqué, il suffit de décomposer le nombre
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 Private Function FromJulianDate(julianDate As Integer) As DateTime If julianDate < 0 OrElse julianDate > 199365 Then Throw New ArgumentException("Not a valid date.", "julianDate") End If Dim y2kflag As Boolean = julianDate >= 100000 Dim dayOfYear As Integer = julianDate Mod 1000 Dim year As Integer = (julianDate \ 1000) Mod 100 + (If(y2kflag, 2000, 1900)) Dim daysInYear As Integer = If(DateTime.IsLeapYear(year), 366, 365) If dayOfYear < 1 OrElse dayOfYear > daysInYear Then Throw New ArgumentException("Not a valid date.", "julianDate") End If Return New DateTime(year, 1, 1).AddDays(dayOfYear - 1) End Function
Code:Dim d As DateTime = FromJulianDate(95001) ' 01/01/1995
Simple, mais belle fonction tom :ccool:
Merci à tous pour la réponse, veuillez svp voir le code de la fonction inverse(c'est à dire du date du jour au date julian) et me dire l'erreur,elle retourne une valeur erroné.
Merci :)
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 Public Function JDate(ByVal d As Date) As Decimal Try Dim dd As Date = New Date(Year(d), 1, 1) Dim J As Decimal = DateDiff(DateInterval.Day, dd, d) Dim a As Decimal = (Year(d) - 1900) * 1000 Return J + a Catch ex As Exception Return 0 End Try End Function
Il manque 1 à la valeur retournée : par exemple, si on est le 2ème jour de l'année, quand tu fais un DateDiff par rapport au 1er jour de l'année, la différence est de 1 jour, or la valeur que tu veux est 2. Donc il faut juste ajouter 1 au résultat obtenu
Et perd l'habitude de catcher des exceptions qui n'ont aucune raison de se produire... le code que tu as écrit ne déclenchera jamais d'exception, donc inutile de mettre un catch
Bonjour,
Es-tu certain de parler de date Julienne (avant le 15 octobre 1582), ça ne semble pas être le cas...
Ton exemple n'est pas une conversion de système de datation, mais de notation d'une date grégorienne, je ne vois pas pourquoi tu parles de date "julienne" ?
A contrario de VB qui remonte à la date d'adoption par les anglais de la réforme grégorienne, et non à la réfome proprement dite, Il y a une classe en VB net :
JulianCalendar, classe .NET Framework 4
Ici :
http://msdn.microsoft.com/fr-<br /> ...ncalendar.aspx
Cette classe ne fonctionne que juqsqu'à l'an Grégorien 1, sinon il faut utiliser les calculs astronomique avec le JJ = JourJulien :
Voici un exemple (à copier coller), que j'avais donné sur le site vbNet de Microsoft, il s'applique au JJ positifs, donc avant le (-4713) :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133 Option Explicit On 'objets = 9 (form + (textbox * 6) + (button * 2) ' nota bene : les textbox sont chargés pour la démonstration... Class form1 Dim Jour As Long Dim Mois As Long Dim Annee As Long Dim heure As Long Dim JJ As Double Dim jourSemaine Dim calendrier ' Sub form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load TextBox1.Text = Now.Day TextBox2.Text = Now.Month TextBox3.Text = Now.Year TextBox4.Text = TimeOfDay.Hour TextBox5.Text = "" ' JJ TextBox6.Text = "" ' résultat End Sub Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' date en JJ Dim P As Double Dim y As Long Dim m As Long Dim a As Long Dim b As Long Dim gregorien As Boolean ' Jour = CLng(TextBox1.Text) Mois = CLng(TextBox2.Text) Annee = CLng(TextBox3.Text) heure = CLng(TextBox4.Text) ' P = Jour + (heure / 24) ' jour,heure y = Annee m = Mois If Mois < 3 Then ' correctif février y = y - 1 m = Mois + 12 End If If y > 0 Then ' année positive JJ = Fix(365.25 * y) + Fix(30.6001 * (m + 1)) + P + 1720994.5 Else ' année négative JJ = Fix(365.25 * y - 0.75) + Fix(30.6001 * (m + 1)) + P + 1720994.5 End If If Annee > 1582 Then gregorien = True ' réforme grégorienne If Annee < 1582 Then gregorien = False If Annee = 1582 Then If m < 10 Then gregorien = False If m > 10 Then gregorien = True If m = 10 Then If Jour < 15 Then gregorien = False If Jour > 14 Then gregorien = True End If End If If gregorien = True Then ' décompte 10 jours inexistants a = Fix(y / 100) b = 2 - a + Fix(a / 4) JJ = JJ + b End If If JJ < 0 Then TextBox5.Text = "JJ négatif : hor limite (1/1/-4712:12" Exit Sub End If TextBox6.Text = "JJ = " & JJ TextBox5.Text = JJ End Sub Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click ' JJ en date Dim z As Double ' ent Dim f As Double ' dec Dim a As Double Dim aa As Double ' An Dim b As Double Dim c As Double Dim d As Double Dim ee As Double Dim jr As Double Dim ms As Double Dim an As Double Dim n As Double Dim js As String ' jour semaine Dim hjj As Double ' heure du JJ ' JJ = CDbl(TextBox5.Text) JJ = JJ + 0.5 z = Fix(JJ) f = System.Math.Round(JJ - z, 3) If z < 2299161 Then aa = Fix(z) ' avant réforme grégorienne If z >= 2299161 Then ' après réforme grégorienne (-10 jours) a = Fix((z - 1867216.25) / 36524.25) aa = (z + 1 + a) - Int(a / 4) End If b = aa + 1524 c = Int((b - 122.1) / 365.25) d = Int(365.25 * c) ee = Int((b - d) / 30.6001) jr = b - d - Int(30.6001 * ee) + f If ee <= 13.5 Then ms = ee - 1 If ee > 13.5 Then ms = ee - 13 If ms <= 2.5 Then an = c - 4715 If ms > 2.5 Then an = c - 4716 ' 12h JJ = 0h00 calendaire (GMT) If heure < 12 Then n = Fix(JJ + 1.5) Mod 7 If heure >= 12 Then n = Fix(JJ + 1) Mod 7 Select Case n Case 0 : js = "di " Case 1 : js = "lu " Case 2 : js = "me " Case 3 : js = "me " Case 4 : js = "je " Case 5 : js = "ve " Case 6 : js = "sa " End Select If heure < 1 Then hjj = 0 If heure > 0 Then hjj = JJ - Int(JJ) If hjj < 1 Then heure = 0 If hjj > 0 Then heure = Int(hjj / 0.041) End If TextBox6.Text = js & Int(jr) & "/" & Format(ms, "00") & "/" & an & " à " & heure & "h" End Sub End Class
En fait ça n'a pas de rapport avec le calendrier julien, c'est juste une notation que les anglophones appellent abusivement "julian date format"
http://en.wikipedia.org/wiki/Calendar_date#Usage_issues
Ce format est aussi mentionné ici :
http://en.wikipedia.org/wiki/ISO_8601#Ordinal_dates
Et ils disent :
Citation:
This system is sometimes incorrectly referred to as "Julian Date"
n'oublie pas de marquer le topic comme :resolu:
Bonjour
j'ai vu les exemples de codage pour la conversion Julien<=>Grégorien
Est ce que quelqu'un aurait le même script pour la conversion Grégorien<=>Hébraïque et Grégorien<=>Musulman
Merci d'avance pour votre aide