<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>یادداشتهای بیت نیمسوز &#187; تاریخ شمسی</title>
	<atom:link href="http://cyberrabbits.net/tag/shamsi-calendar-fa/feed/" rel="self" type="application/rss+xml" />
	<link>http://cyberrabbits.net</link>
	<description>یک وبلاگ دیگر از یک برنامه نویس دیگر</description>
	<lastBuildDate>Thu, 17 May 2012 06:58:08 +0000</lastBuildDate>
	<language>fa</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>تبدیل تاریخ</title>
		<link>http://cyberrabbits.net/78/date-convertor/</link>
		<comments>http://cyberrabbits.net/78/date-convertor/#comments</comments>
		<pubDate>Sat, 19 Dec 2009 20:20:50 +0000</pubDate>
		<dc:creator>فرود</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[برنامه نویسی]]></category>
		<category><![CDATA[دلفی]]></category>
		<category><![CDATA[Gregorian Date]]></category>
		<category><![CDATA[Jalali Date]]></category>
		<category><![CDATA[تاریخ شمسی]]></category>
		<category><![CDATA[تاریخ میلادی]]></category>

		<guid isPermaLink="false">http://cyberrabbits.net/?p=78</guid>
		<description><![CDATA[بارها در این باره، با خیلی ها بحث کردم. حالا یک بار قصد دارم اینجا هم همه چیز را توضیح بدهم، شاید برای بار آخر. مساله تبدیل تاریخ تقریبا مشکل همه هست. هر نو برنامه نویسی، بلافاصله زمانی که نیازمند نوشتن یک برنامه باشد، به اولین موضوعی که فکر میکند، تبدیل تاریخ هجری به میلادی&#8230;
پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/646/php-and-files/' rel='bookmark' title='PHP و فایلها&#8230;'>PHP و فایلها&#8230;</a> <small>توی ویندوز کوچک و بزرگ بودن حروف در اسم فایلها...</small></li>
<li><a href='http://cyberrabbits.net/909/hiphop/' rel='bookmark' title='HipHop'>HipHop</a> <small>&#8211; این فقط یه معرفی ساده یه پروژه است نه...</small></li>
<li><a href='http://cyberrabbits.net/134/gtranslate/' rel='bookmark' title='مترجم گوگل'>مترجم گوگل</a> <small>همون طور که مطمئنا میدونید مترجم گوگل یکی از ابزارهای...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>بارها در این باره، با خیلی ها بحث کردم. حالا یک بار قصد دارم اینجا هم همه چیز را توضیح بدهم، شاید برای بار آخر. مساله تبدیل تاریخ تقریبا مشکل همه هست. هر نو برنامه نویسی، بلافاصله زمانی که نیازمند نوشتن یک برنامه باشد، به اولین موضوعی که فکر میکند، تبدیل تاریخ هجری به میلادی و برعکس است. من کلا با تاریخ قمری کاری ندارم، اهمیتی هم برای من نداشته و ندارد، ولی این بحث شامل تاریخ قمری یا اصولا هر تاریخ دیگری که نیازمند تبدیل به میلادی و برعکس برای آن وجود داشته باشد می شود.</p>
<h2>1- تعریف تاریخ در ویندوز</h2>
<p>تاریخ در ویندوز، یک عدد اعشاری است، قسمت صحیح آن ، تعداد روزهایی است که از اولین روز اولین ماه سال 1900 گذشته است. قسمت اعشاری هم کسری از روز است که تا لحضه مورد نظر گذشته است. مثلا 0.5 یعنی 12 ظهر، 0.25 یعنی 6 صبح و 0.75 یعنی 6 بعد از ظهر و الی آخر. مثلا عدد 1.5 یعنی 1 روز بعد از روز مبنا، ساعت 12 ظهر. البته مناطق زمانی هم در این مبنا تاثیر دارند و در صورت لزوم باید در نظر گرفته شوند .این تعریف، در دلفی هم رعایت شده است. و تا آنجا که میدانم، در مورد .NET هم به همین صورت است. (اگر کسی اطلاع دقیق تری دارد خبر بدهد، اصولا من از دات نت فراری هستم :) )</p>
<h2>2-تعریف تاریخ در لینوکس</h2>
<p>تاریخ در لینوکس یک عدد صحیح است، که نشانگر تعداد ثانیه های (در بعض نسخه ها و جاوا میلی ثانیه) پس از نیمه شب روز اول، ماه اول سال 1970 است. البته این تعریف به علت اینکه از ثانیه ها استفاده میکند، با نواحی زمانی نیز تغییر میکند، مثلا برای تاریخ ما، این مبنا سه ساعت و  نیم جلوتر است. یعنی در هر منطقه زمانی عدد تاریخ با منطقه زمانی دیگر در یک لحظه متفاوت است. جاوا، PHP و Ansi C هم از این تعریف استفاده میکنند.</p>
<h2>3- تبدیل تاریخ</h2>
<p>تبدیل تاریخ، همیشه روشی است برای تبدیل یک مبنا (مثلا شمسی) به مبنای دیگر (مثلا میلادی) اما کی؟ در چه شرایطی؟<br />
<span id="more-78"></span><br />
مثلا ، یکی از بانکها، برای تاریخ شمسی، از یک سیستم خاص استفاده کرده ، مثلا 8 اسفند 88 را به صورت 881208 در دیتابیس ذخیره میکند، روشی بسیار بد که خیلی از قابلیت های فیلدهای تاریخ را از شما میگیرد، کلا به نظر من، برای ذخیره کردن و کلا همه عملیات های مربوط به تاریخ، از تاریخ میلادی و همین فرم استاندارد استفاده شود، ولی برای نمایش تاریخ، به جای استفاده از توابع استاندارد هر زبان (مثلا date در PHP یا TimeToStr در دلفی ) توابعی نوشته و استفاده شود که ورودی آنها تاریخ استاندارد (همان عدد اعشاری در ویندوز یا صحیح در لینوکس) و تاریخ مناسب با فرمت درخواستی چاپ شود. (مثلا در مورد PHP کتابخانه JDF همین کار را انجام داده، که البته من روش کار آن را نمی پسندم، گرچه حرفم به این معنی نیست که از کار آنها استفاده نکرده ام، یا اینکه کار آنها بی ارزش است.)</p>
<h2>4- الگوریتم تبدیل</h2>
<p>این مساله همیشه برای همه بحث بر انگیز بوده ولی شاید یکی از کار آمد ترین روشها به این صورت است (در مورد ویندوز، و گرنه در مورد لینوکس همین روش استفاده میشود با این تفاوت که به جای روز از ثانیه استفاده میشود) :<br />
1- پیدا کردن اینکه از تاریخ مبدا مورد نظر (مثلا میلادی) تا روز اول و مبنای آن تاریخ به عبارتی 1/1/1  چند روز (لینوکس : چند ثانیه) گذشته است.<br />
2- کم کردن یا افزودن فاصله روزهای(لینوکس : ثانیه) 1/1/1 مبنای مبدا (مثلا میلادی) تا روز 1/1/1 مبنای مقصد (مثلا شمسی) به این صورت، تعداد روزهای(لینوکس : ثانیه های) گذشته از مبنای مقصد را خواهیم داشت.<br />
3- پیدا کردن اینکه این تعداد روزهای(لینوکس : ثانیه های) بدست آمده در گام دوم، چند سال و چند ماه و چند روز خواهد شد. (با احتساب سالهای کبیسه و قوانین و قواعد )</p>
<h2>5- بهینه سازی</h2>
<p>اما، این روش میتواند بهینه شود. اول ویندوز (در کل بحث اختلاف زمانی را در نظر نمیگیریم، خیلی ساده هر جا لازم است آنرا اضافه کنید):<br />
گام اول را میتوان از سیستم میلادی به هر سیستم دیگری تقریبا حذف کرد. فقط کافی است قسمت صحیح عدد تاریخ را بگیریم، بعلاوه یک عدد ثابت بکنیم (تعداد روزهایی که از روز اول ماه اول سال 1900 از 1/1/1 فاصله دارد و  اگر اشتباه نکنم، 693594 روز)  و در این صورت عدد مورد نظر را خواهیم داشت، یعنی با یک Type Cast ساده، و یک تفریق، نه یکسری محاسبات وقت گیر و بیخود.<br />
از طرفی برای تبدیل هر نوع تاریخی به تاریخ میلادی یک روش ساده هست. مثلا برای شمسی کافی است بفهمیم که روز مورد نظر چند روز بعد از روز (اگر اشتباه نکنم) 10 دی ماه 1348 است. یعنی در حقیقت نیازی به یک تبدیل واقعی نیست، در مورد قسمت ساعت هم که هیچ تغییری لازم نیست، چون در مبناهای مختلف که ساعت مثلا 12 متفاوت از ساعت 12 مبنای دیگر نیست (در یک منطقه زمانی)</p>
<p>و لینوکس.  همین روش بالایی کاملا موثر خواهد بود، یعنی بهینه سازی دقیقا به همان شکل ممکن است، فقط به جای روز از ثانیه استفاده میشود، یا برای راحت تر شدن، ثانیه ها را به روز تبدیل میکنیم. البته باید توجه کرد مبنا سال 1970 است نه 1900</p>
<h2>6-دانلود کد</h2>
<p>خوب این بهینه سازی میتواند سرعت را بالا ببرد، دقت بیشتری دارد و بسیار ساده و قابل فهم خواهد بود. من الگوریتم این تبدیل برای PHP و دلفی را از قبل پیاده سازی کرده ام (نسخه نسبتا کاملی هم برای جاوا هست که بعد از کمی تغییرات، منتشر میشود) و آنرا در <a href="https://sourceforge.net/projects/jdate-project/files/jdate-project.zip/download">این آدرس</a> قرار داده ام. علاوه بر آن، ضمن تشکر فراوان از کتابخانه JDF و کلیه کسانی که  آنرا ایجاد کرده و در اختیار همگان گذاشته اند، یک مقایسه هم برای این دو ایجاد کرده ام که در <a href="http://cyberrabbits.net/non/jdatebench/">این آدرس</a> قابل مشاهده است . البته توصیه میکنم به جای استفاده از این سورس از سورس به روز شده SVN استفاده کنید، چون در هر زمان که مشکلی در این کد پیدا شود اصلاح آن در SVN قرار خواهد گرفت.</p>
<p>آدرس SVN :<br />
<code class="link">https://jdate-project.svn.sourceforge.net/svnroot/jdate-project</code></p>
<p><ins datetime="2010-02-14T08:16:58+00:00"><br />
امروز کار این دوستان رو هم دیدم : <a href="http://iranphp.org/node/6">http://iranphp.org/node/6</a> کارشون خوبه و تو این زمینه میتونه خیلی مفید باشه،‌این دوستان از همون الگوریتم قدیمی استفاده کردن ولی تابع date رو خیلی خوب شبیه سازی کردن. به هر حال برای اینکه این پست تکمیل بشه اون رو اینجا گفتم و علاوه بر اون چون sf.net ایران رو تحریم کرده من یه نسخه از فایل تبدیل تاریخ خودمو همین جا برای دانلود میذارم. </ins></p>
<p><ins datetime="2012-04-04T14:33:50+00:00">یه باگ وجود داشت توی سال ۹۱ :) که حل شد</ins><br />
<a href="http://cyberrabbits.net/wp-content/uploads/2009/12/jDate.zip">از اینجا میتونید دانلودش کنید</a></p>
<div class="plus-one-wrap"><g:plusone href="http://cyberrabbits.net/78/date-convertor/"></g:plusone></div><p>پستهای مرتبط :<ol>
<li><a href='http://cyberrabbits.net/646/php-and-files/' rel='bookmark' title='PHP و فایلها&#8230;'>PHP و فایلها&#8230;</a> <small>توی ویندوز کوچک و بزرگ بودن حروف در اسم فایلها...</small></li>
<li><a href='http://cyberrabbits.net/909/hiphop/' rel='bookmark' title='HipHop'>HipHop</a> <small>&#8211; این فقط یه معرفی ساده یه پروژه است نه...</small></li>
<li><a href='http://cyberrabbits.net/134/gtranslate/' rel='bookmark' title='مترجم گوگل'>مترجم گوگل</a> <small>همون طور که مطمئنا میدونید مترجم گوگل یکی از ابزارهای...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://cyberrabbits.net/78/date-convertor/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
	</channel>
</rss>

