# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > ASP.NET Web Forms >  پایان مشکل تاریخ شمسی

## Mahdavi

با سلام 
مدتی هست که می بینم بحثهای زیادی در مورد تغییر تاریخ میلادی سه شمسی مطرح شده و راه حل های گوناگون.
همه این راه ها یه مشکل دارند و اون اینکه اگه در پروژه قسمتهای مختلفی داشته باشید که از تاریخ استفاده می کنند شما برای تبدیل همه اونا باید کد بنویسید. و دیده شده که بعضی ها کنترلهایی هم واسه تاریخ نوشته و می فروشند. در صورتیکه با یه تغییر کوچک در Pcal.cs که آقای *امید خندان* زحمت اونو کشیدند و اضافه کردن چند خط کد ساده تمام تاریخ هاتون شمسی نمایش داده میشه و شما به شکل میلادی ذخیره خواهید کرد. از خوبی های این روش اینه که دیگه نیازی نیست تاریخ رو به شکل رشته ای ذخیره کنید . بلکه چون میلادی ذخیره میشه شما خیلی راحت می تونید با اونا کار کنید.
من کد Pcal.cs رو ضمیمه می کنم که شما باید به پروژه مورد نظرتون اضافه کنید و همچنین چند خط کد زیر رو به InitializeComponent مربوط به Global.asax قرار دهید تا کل تاریخ های سیستم شما شمسی شوند و 
حتی کنترل Calender خود ‍C#‎.
دیگه فکر کنم کسی در مورد تاریخ تاپیکی اینجا نذاره.(انشاالله):)
کد یه برنامه نمونه هم ضمیه شده است.

private void InitializeComponent()
		{	
		 System.Globalization.CultureInfo cf = new System.Globalization.CultureInfo("fa-IR");
			cf.DateTimeFormat.Calendar =new System.Globalization.PersianCalendar();
			cf.DateTimeFormat.MonthNames = new string[]{
		"فروردین",
		"اردیبهشت",
		"خرداد",
		"تیر",
		"مرداد",
		"شهریور",
		"مهر",
		"آبان",
		"آذر",
		"دی",
		"بهمن" ,
		"اسفند",
		""};
			System.Threading.Thread.CurrentThread.CurrentCultu  re = cf;
			this.components = new System.ComponentModel.Container();
		}

----------


## Babak-Aghili

دست گلتون درد نکنه ..

ممنون .

----------


## Peyman_Ranjbar

برای winapp این کد رو میشه استفاده کرد؟

----------


## Mahdavi

بله
در winapp هم میشه . فقط با این تفاوت که کد مربوطه رو در  Form1_Load فرم اصلی تون قرار بدید.
دوم اینکه بر روی کنترلهاش در حالت اصلی تاثیری نداره و مثل وب نیست.

----------


## Identifier

آقای مهدوی واقعا جالب بود استفاده کردیم

----------


## rainynight

میشه برای vb هم بگذارید

----------


## javad3151

آقای مهدوی دستتون درد نکنه ، واقعا حرف نداره 
ولی من هر کاری کردم نتونستم تبدیل به vb.net  کنم (با چند convertor تست کردم ولی نشد)
نمیشه یه جوری در پروژه های Vb  هم ازش استفاده کرد؟

----------


## javad3151

من تونستم در vb  ازش استفاده کنم 
موقع نمایش اطلاعات مشکلی نداره ، ولی هنگام ذخیره اطلاعات همون شمسی رو ذخیره می کنه من به این صورت تاریخ رو در بانک ذخیره می کنم :

Insert Into main (in_date) values (# " & textbox1.text & "#);"

اگر میشه راهنمایی کنید.

----------


## rahele_sa

میشه بگید از این فایل PCal.cs چگونه استفاده کنم

----------


## sh

دیگه لازم نیست از اون فایل استفاده کنی چون توی کلاسهای دات نت 2 هستش

----------


## Mahdavi

> من تونستم در vb ازش استفاده کنم 
> موقع نمایش اطلاعات مشکلی نداره ، ولی هنگام ذخیره اطلاعات همون شمسی رو ذخیره می کنه من به این صورت تاریخ رو در بانک ذخیره می کنم :
> 
> Insert Into main (in_date) values (# " & textbox1.text & "#);"
> 
> اگر میشه راهنمایی کنید.


دوست عزیز شما باید قبل از ذخیره اونو به میلادی تبدیل کنید.
با استفاده از کلاس PersianCalender  :

 
new DateTime(1385,4,12,new System.Globalization.PersianCalendar());


که شما :
1- کد رو به vb برای خودتون بنویسید.
2- به جای اعداد 1385 و 4 و 12 از محتویات اون EditBox مقادیر سال و ماه و روز رو جدا کرده و به این شکل یه Datetime میلادی بدست بیارید.
موفق باشید

----------


## Mahdavi

> دیگه لازم نیست از اون فایل استفاده کنی چون توی کلاسهای دات نت 2 هستش


بله دوست عزیز آقا شهریار
اما متاسفانه دات نت 2 مشکلش اینه که PersianCalender رو به عنوان calender  برای
DateTimeFormat.Calendar  قبول نمیکنه.
لذا هنوز من نتونستم از این روش تو دات نت 2 استفاده کنم

----------


## Mahdavi

> میشه بگید از این فایل PCal.cs چگونه استفاده کنم


اونو به پروژه خودتون add کنید.
به نمونه کد که اول پست گذاشتم هم نگاه کن.
همچنین میتونی بعد از ساختن object  از متدهاش هم استفاده کنی.

 
System.Globalization.PersianCalendar pc = new System.Globalization.PersianCalendar();
pc.GetYear(DateTime.Now);


اینم یه نمونه استفاده از آن. که سال جاری رو به شمسی بر می گردونه .

----------


## mohsenna30ri

*من وقتی این یا امثال این کد ها رو تو اکسس و ماژول می برم فونت فارسی اون به علامت سوال تبدیل می شه چرا؟*

----------


## majidhb

آیا می دانید چطور می شود تقویم فارسی را در دات نت 2 نمایش داد؟

----------


## mahdi_negahi

این راه فقط ماله VS2003 است در همین صفحه برای asp.net2 چیزی است

----------


## saeid taheri

آیا ممکن نمونه vb.net را هم بذارید
با تشکر

----------


## manager

آقا ما هم در دات نت 2 با هاش مشکل پیدا کردیم.....کسی می دونه تو دات نت 2 چه کار باید کرد ؟

----------


## manager

دوستان کسی نمی تونه این مشکل رو تو دات نت 2 حل کنه ؟
نمی دونم چرا CultureInfo("fa-IR"( تقویم PersianCalender رو Support نمی کنه !!!!!
من یه چند ماهی هست که کد نویسی نکردم یکم تسلطم کم شده. تو دات نت 2 ما کلاس PersianCalender رو تو خود mscorelib داریم و دیگه به PCal.cs احتیاجی نیست ولی مشکل اینه که fa-IR این تقویم رو قبول نمی کنه !!!! کدهائی که می نویسم شبیه همون کدهای راه اندازی است که تو global.asax گذاشته می شه (و اول تاپیک یه اشاره بهش شده)

Please Help Me !!! :خیلی عصبانی:

----------


## اَرژنگ

> آقا ما هم در دات نت 2 با هاش مشکل پیدا کردیم.....کسی می دونه تو دات نت 2 چه کار باید کرد ؟


http://lytopia.com/Articles/Article.aspx?id=6

----------


## manager

> http://lytopia.com/Articles/Article.aspx?id=6
> ------------------------------------------------------->
> public DateTime DateInOtherCalendar( DateTime aDate , Calendar OtherCalender )
> {
>   int Year = OtherCalender.GetYear(aDate);
>   int Month = OtherCalender.GetMonth(aDate);
>   int Day = OtherCalender.GetDayOfMonth(aDate);
>   DateTime DateInOtherCalendar = new DateTime(Year, Month, Day);
>   return DateInOtherCalendar;
> ...



دوست عزیز مثل اینکه شما مشکل رو متوجه نشدید. من می خوام کنترل تقویم CalenderControl رو شمسی کنم ! و می خوام کل Treatام رو فارسی کنم. نمی خوام عمل تبدیل تاریخ ها رو انجام بدم .!!!!!

----------


## سار

> ﻿بارها برای همه ما برنامه نویسان وب پیش آمده که در یک صفحه وب نیاز به گرفتن تاریخ از کاربر داریم، نبودن یک تقویم شمسی که بصورت Date Picker عمل نماید، این ایده را به من داد که باید خودم دست به کار شوم. بالاخره با بررسی Date Picker های موجود، تصمیم به تغییر آن و ایجاد این تقویم که میبینید گرفتم. این برنامه اولین سری از تقویم شمسی سمت کلاینت است که بطور 100% با جاوا اسکریپت نوشته شده و بصورت انتخاب تاریخ (Date Picker) کار میکند و اون رو میتونین در هرجایی از صفحه وب تون که نیاز به گرفتن ورودی تاریخ از کاربر دارین قرار بدین و تاریخ مورد نظر را از کاربر دریافت نمایید. استفاده از این تقویم که بصورت یه فایل جاوااسکریپت به برنامه شما اضافه میشود بسیار ساده میباشد و با زدن یک لینک یا هر طوری که خودتون تعریف میکنین، این تقویم ظاهر شده و کاربر شما میتونه بجای تایپ تاریخ در فرم، روز مورد نظر خودش رو از تقویم انتخاب کنه و بصورت خودکار در فیلد شما وارد نماید. این امکان چیز جدیدی نیست و تا بحال بصورتهای مختلفی مثل کامپوننت در دلفی، کنترل ActiveX برای برنامه های ویژوال بیسیک، تقویم استاتیک در PHP و حتی بصورت یک کامپوننت که در برنامه های ASP.net استفاده کنید وجود داشته است. ولی داشتن یه تقویم به این صورت با جاوا اسکریپت که از آن به راحتی در هر صفحه و برنامه ای حتی در یه صفحه استاتیک HTML بتوان استفاده کرد تا بحال وجود نداشته. بهرحال امیدوارم از داشتن این تقویم که بصورت رایگان در اختیار شما قرار میدهم، استفاده و لذت کامل را ببرید.



متن بالا از سایت http://hoomb.dnsalias.com/index.php?page=about بود.
برید برنامه رو بگیرید و لذت ببرید.

----------


## Mahdavi

مشکل تاریخ در asp.net 2.0 هم همچون 1.0 حل شد . یه نگاهی به این مقاله بندازید.
http://www.sayan.ir/ViewArticle.aspx?ArticleID=281

----------


## raham_panjehshahi

با سلام و تشکر برای برنامه جاوا اسکریپت شما هیچ لینکی وج.د نداره ، من هم شدیدا در یک پروژه به آن نیاز دارم ، ممکنه لطف کرده و آن را برای من ایمیل کنید . با تشکر فراوان
raham_panjehshahi@yahoo.com

----------


## s_juyayekar

آقای مهدوی و اقعا دستتون درد نکنه!
اگه بدونین من چند وقته دنبال این تبدیل تقویم بودم!!!!
بازم ممنون!
خیلی عالی بود :تشویق:  :تشویق:  :تشویق:

----------


## hesampersian

دوست عزیز سایت http://www.sayan.ir/ViewArticle.aspx?ArticleID=281 باز نمیشه، لطفا راهنمایی کنید چجوری در دات نت 2 از این کدها به درستی استفاده کنیم؟ چون الان من دانلود کردم ولی اررور میدن!

ممنون

----------


## ictfac

سایت باز نمیشه لطفا آدرس دیگری اعلام کنید.

----------


## iman_22a

> سایت باز نمیشه لطفا آدرس دیگری اعلام کنید.


الان مدتیه که خیلی از سایتهای فارسی برای من باز نمیشن ، مثل : Blogfa ، Techno2000 ، Aviny.com و کلی سایت دیگه که الان حضور ذهن ندارم . نمیدونم جریان چیه !

----------


## taghymusavi

سلام 
مي خوام كاري كنم كه با دادن يه تاريخ شمسي روزش تو هفته رو نشون بده 
لطفا راهنمايي ام كنيد.
ممنون

----------


## mhjmeshkaat

مدتی هست که می بینم بحثهای زیادی در مورد تغییر تاریخ میلادی سه شمسی مطرح شده و راه حل های گوناگون.
همه این راه ها یه مشکل دارند و اون اینکه ...

سلام جناب مهدوي
براي ما مبتديها ميشه يه بار توضيح بدين چطور ميشه يه كاري كرد كه ديگه مشكل تاريخ شمسي نداشته باشيم مخصوصا با برنامه نويسي توي ويژوال بيسيك. لظفا راهكارتون رو مرحله به مرحله و روشن توضيح بديد تا روش كار دستمون بياد.
بسيار متشكرم

----------


## amordad

با سلام این موضوع در دات نت 4 صادق نیست
همان طور که میدانید در دات نت 4 آن کلاس معروف نوشته شده توسط آقای خندان کار نمیکند و فقط تا ورژن 3.5 میتوانستیم از آن استفاده کنیم، اما ابن بار یک پکیج توسط مهندس کرامتی عرضه شده که این مشکل را حل میکند ولی فعلا فقط ایران هاست آن را پشتیبانی میکند.
البته برای این که در دات نت 4 بصورت لوکال هم بخواهید از تقویم شمسی استفاده کنید حتما باید این پکیج را نصب کنید.
جهت استفاده، کلاس مربوطه را به همراه پکیج مورد نظر جهت دانلود قرار دادم

----------


## ASP.NET2

عجیبه  :متفکر: 
هیچ نحوه ی استفاده ای چیزی نداره ؟این کلاس CalendarUtils.cs چیه و اون Package چیه؟

----------


## esialex

سلام به همگی 
میخوام مشکل تاریخ رو به صورت کلی حل کنم.
شرکت ماکروسافت یک کتابخانه تبدیل تاریخ میلادی به شمسی درست کرده که در کتابخانه ای به نام Globalization قرار دارد این کتابخانه رو در قسمت بالای برنامه(تا حد مقدور در یک کلاس بنویسید تا هر وقت نیاز داشته باشید به ان دسترسی داشته باشید) using کنید به این صورت
using System.Globalization;

اگر در کلاس نوشته اید یک متد  به کلاس اضافه کنید مثلا GetCurrentDate()

 public static string GetCurrentDate()
        }
{

حلا درون این متد باید یک نمونه از کلاس PersianCalendar که در کتابخانه Globalization وجود دارد بسازیم به این صورت 
 PersianCalendar pc = new PersianCalendar();
حالا می توانیم روز و ماه و سال بدست اوریم
به این صورت
int y = pc.GetYear(DateTime.Now);
این کد سال جاری را به ما می دهد.
 int m = pc.GetMonth(DateTime.Now);
این کد ماه رو به ما میدهد که اگر میخواهید ان را به حروف(فرودین، اردیبهشت و......) بنویسید ان را به صورت جدا گانه بدست اورید و در یک دستور کیس قرار دهید.
int d = pc.GetDayOfMonth(DateTime.Now);
این دستور یک روز از ماه رو می گیرد که همان روز جاری میشود متدهای دیگری هم وجود دارد که خودتون با کمی دقت می توانیم از ان ها استفاده کنید
من کد را به صورت یک کلاس نوشتم که در اختیارتون قرار می دهم
فقط شما این کدها در یک کلاس قرار داده و namespace ان را به namespace پروژه خود تغییر دهید.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;

namespace SaleSystem.Classes
{
    public class MyTools
    {
        /// <summary>
        /// برای بدست آوردن تاریخ شمسی جاری سیستم
        /// </summary>
        /// <returns>به صورت رشته و با اسلش</returns>
        public static string GetCurrentDate()
        {
            PersianCalendar pc = new PersianCalendar();
            int y = pc.GetYear(DateTime.Now);
            int m = pc.GetMonth(DateTime.Now);
            int d = pc.GetDayOfMonth(DateTime.Now);

            string s = "";
            s += y + "/";
            if (m < 10)
                s += "0";

            s += m + "/";

            if (d < 10)
                s += "0";

            s += d;

            return s;
        }
    }
}

نحوه فراخوانی این کد در برنامه :
چون متد این کلاس از نوع static تعریف شده دیگه نیاز نیست از ان یه نمونه بسازیم و به این صورت عمل میکنیم.
txtDate.Text = MyTools.GetCurrentDate();
من ان را درون textbox قرار داده ام.و نتیجه به این صورت است :1389/07/02
این کلاس رو میتوانیم در ASP.NET و C#‎‎ وvb.net استفاده کنید هیچ فرقی نمیکند با هیچ گونه تغییری
امیدوارم که تونسته باشم کمکی کرده باشم اگر مشکلی در برنامه نویسی مخصوصا در C#‎‎ داشتید حتما در یک تاپیک بنویسید بعد ادرس ان تاپیک رو برای من ایمیل کنید (esialex_4u@yahoo.com)   خوشحال میشم بتونم کمکی کنم.

----------


## Software.Student2010

سلام قربان

آقا من می خوام تو دیتاباس ذخیره کنم. با این روش مهندس کرامتی.

چی جوری این کار انجام میشه؟ فیلد dateTime در نظر گرفته بشه؟ چه کنیم

----------


## na3er-faraji

دوستان. من به این روش نیاز دارم. کد رو هم به global.ascx اضافه کردم . اما این خط خطا میده. کسی میتونه راهنمایی کنه؟؟؟

this.components = new System.ComponentModel.Container();

----------


## cjNet

سلام به همه دوستان .

این هم سورس یه کلاس که تاریخ فعلی سیستم رو به هم به صورت رشته و هم به صورت یه عدد هشت رقمی  و البته به صورت شمسی به ما می دهد .... 
*
using System;
using System.Data;
using System.Configuration;
using System.Web;

using System.Globalization;


public class PersianDate
{
    static PersianCalendar pc=new PersianCalendar();
    static DateTime dt = DateTime.Now;

    static PersianCalendar pc_1 = new PersianCalendar();
    static DateTime dt_1 = DateTime.Now;

    public PersianDate()
    {
        
    }
    // -----------------------------------------------------
    public static string ShamsiDate()
    {
        string year, month, day;
        //return (pc.GetYear(dt) + "/" + pc.GetMonth(dt) + "/" + pc.GetDayOfMonth(dt));
        day = pc.GetDayOfMonth(dt).ToString(); ;
        if (pc.GetDayOfMonth(dt) < 10)
        {
            day = "0" + pc.GetDayOfMonth(dt).ToString();
        }
        month= pc.GetMonth(dt).ToString();
        if (pc.GetMonth(dt) < 10)
        {
            month = "0" + pc.GetMonth(dt).ToString();
        }
        year=pc.GetYear(dt).ToString();
        
        return (day+"/"+ month + "/" +year);
    }

    public static long NumericDate()
    {
        string strYear, strMonth, StrDay;

        int year=pc_1.GetYear(dt_1);
        int month=pc_1.GetMonth(dt_1);
        int day=pc_1.GetDayOfMonth(dt_1); 

        strYear=year.ToString();

        if (month < 10)
        {
            strMonth = "0" + month.ToString();
        }
        else
            strMonth = month.ToString();

        if (day < 10)
        {
            StrDay = "0" + day.ToString();
        }
        else
            StrDay = day.ToString();

        string temp = strYear + strMonth + StrDay;
        long date = long.Parse(temp);


        return date;
    }

    public static int GetYear()
    {
        int year = pc_1.GetYear(dt_1);
        return year;
    }

    public static int GetMonth()
    {
        int month = pc_1.GetMonth(dt_1);
        return month;
    }

    public static int GetDay()
    {
        int day = pc_1.GetDayOfMonth(dt_1);
        return day;
    }
}*

امیدوارم مفید باشه ...

----------


## na3er-faraji

عزیزم بنده مشکلی با کلاس های کار با تاریخ شمسی ندارم. فقط میخواستم این روشی که دوستمون گفتن رو انجام بدم که اتوماتیک همه چیز به صورت شمسی نمایش داده بشه. حتی کنترل تقویم.

----------

