C# DateTime do formatu Clarion

C# DateTime do formatu Clarion
P2
  • Rejestracja:prawie 4 lata
  • Ostatnio:ponad rok
  • Postów:148
0

Witam,
W jaki sposób można w C# konwertować DateTime, który ma format yyyy-MM-dd na zapis w postaci CLARION czyli int. W MSSQL wiem jak to się robi,
ale jak to zrobić w C# ???

edytowany 1x, ostatnio: pawelus222
SA
  • Rejestracja:ponad 12 lat
  • Ostatnio:3 minuty
  • Postów:1435
1

A specyfikacja jakaś tego formatu? Potrzebne Ci to przypadkiem do Optimy? Zgodnie z tym co tu jest napisane https://sulmar.blogspot.com/2017/04/konwersja-daty-w-cdn-optima.html

Nie do końca jest tak jak opisano w artykule. Data w rozwiązaniach Comarch (Optima i XL) może być kodowana na kilka sposobów w tym:

  1. Tzw. "Krótki Clarion" - ciąg 5 cyfr, które przechowują informację o ilości dni od daty '1800-12-28' - służy do zapisu dnia
  2. Tzw. "Długi Clarion" - ciąg 9 cyfr, które przechowują informację o ilości sekund od daty '1990-01-01' - służy do zapisu dnia i godziny
  3. Zwykła data w SQL, w części struktur data jest kodowana jako datetime lub date na bazie.

Więc ja bym to załatwił operacjami na datach, tj. (date - new Date(1800,12,28)).Days i podobne, pod warunkiem, że miałbym jak sprawdzić jakieś wzorcowe wyniki.

P2
  • Rejestracja:prawie 4 lata
  • Ostatnio:ponad rok
  • Postów:148
0

Ok, poradziłem sobie wykorzystując SQL i następnie podstawiając datę w formacie Clarion do zmiennej.

JP
  • Rejestracja:ponad 7 lat
  • Ostatnio:5 miesięcy
  • Postów:1065
1

Dawno nie uzywałem ale mam takie coś z dawniejszych czasów

Kopiuj
public static class ClarionDateTimeExtensions
{
	public static int GetClarionDate(this DateTime date)
	{
		DateTime baseDate = DateTime.Parse("1801-01-01");
		System.TimeSpan ts = date - baseDate;
		int l = ts.Days + 4;
		return l;
	}

	public static int GetClarionTime(this DateTime date)
	{
		int l = date.Hour * 360000;
		l += date.Minute * 6000;
		l += date.Second * 100;
		l += date.Millisecond / 10;
		return l + 1;
	}
}
Zobacz pozostałe 2 komentarze
somekind
Oczy krwawią.
JP
No trochę krwawią ale tylko przez 4 linijki. czy tam 5.
somekind
Ale po co takie rzeczy sobie robić? :( :( :(
JP
Życie na krawędzi. Nawet nie jestem pewien czy to ja pisałem bo raczej bym nie rozwlókł tak tego dodawania godzin, minut itd.
JP
  • Rejestracja:ponad 7 lat
  • Ostatnio:5 miesięcy
  • Postów:1065
3

Przepraszam wszyskich za kwrawiące oczy. Nie obiecują jakiejś drastycznej poprawy ale rozumiem, że to mogło być bolesne. :)

Kopiuj
public static class ClarionDateTimeExtensions
{
	
	public static int GetClarionDate(this DateTime date)
	{
		return (date - new Date(1800,12,28)).Days;	
	}
	public static int GetClarionTime(this DateTime date)
	{
		return (int)(date.TimeOfDay.Ticks / 100000);
	}
}
KamilAdam
Ciekawe że brak zmiennej jest uważany za lepszy niż zmienna jednoliterowy <zamyślony> BTW w Haskellu są popularne jednoliterowy nazwy zmiennych
somekind
@KamilAdam: nie chodzi o jednoliterową zmienną. Chodzi o użycie litery, która wygląda jak cyfra. Trzeba mieć talent, żeby z 26 możliwości wybrać tę najmniej czytelną.
JP
Ale cyfry jako nazwy zmiennej to by kompilator nie przepuścił
KamilAdam
@somekind: po pierwsze masz kolorowanie, no chyba że masz niefart i akurat kolorów nie widzisz, po drugie fonty programistyczne są na to przygotowane i jednak w fontach programistycznych 1 różni się od l (a nie zawsze jest to pewne) po trzecie @jacek.placek wbił mi się tu z najlepszym argumentem :P
somekind
Jedyny font, w którym te znaki różnią się znacznie to Wingdings, w pozostałych różnice są prawie niezauważalne. Po drugie kolorowanie nie zawsze jest. Po trzecie w deklaracji widać, że to zmienna, ale w wyrażeniu już niekoniecznie. Nie widzę żadnego sensu w utrudnianiu sobie życia, skoro nieutrudnianie nie wymaga żadnego wysiłku.
obscurity
@jacek.placek: zapomniałeś o tym +1 w GetClarionTime
JP
:( No tak. Będzie jedna setna nanosekundy różnicy, jeśli dobrze pamiętam.
obscurity
jedna setka sekundy. No i zamiast Ticks / 100000 można dać TotalMilliseconds / 10
JP
A to przepraszam. To zmienia wszystko :)
obscurity
mnie nie przepraszaj. Ale co z ludźmi którzy się przez to spóźnią do pracy
JP
:) Napiszę im usprawiedliwienie.
P2
  • Rejestracja:prawie 4 lata
  • Ostatnio:ponad rok
  • Postów:148
0

Ok, a teraz załóżmy, chcemy przy pomocy C# odczytać z bazy MSSQL czas, który jest zapisany w postaci Clarion. Załóżmy kolumna ma nazwę k1 i mamy w niej wartość 6450000 - wartość uzyskana z DateTime w formacie "HH:mm". Odczytując w C# powinniśmy mieć wynik 17:55. Jak to zrobić ? :)

edytowany 1x, ostatnio: pawelus222
obscurity
odwróć to co robią metody powyżej. Trochę przypomnienia matmy z podstawówki
DE
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 3 lata
0
Kopiuj
public TimeSpan GetTimeFromClarion(int time)
{
  return new TimeSpan(time * 100000l);
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.