PDA

View Full Version : تبدیل تاریخ شمسی به میلادی و ذخیره در دیتابیس



Mohammad-Karimi
شنبه 27 آبان 1391, 22:14 عصر
با سلام خدمت دوستان محترم.
بنده مشغول به فارسی سازی و طراحی قالب برای یک سیستم پی اچ پی هستم اما متاسفانه آشنایی بسیار ناچیزی با این زبان دارم .
نیاز به یک فیلد ورودی دارم که تاریخ رو در قالب شمسی دریافت کنه و بصورت میلادی در دیتابیس ذخیره کنه .
تا بعداً از دیتا بیس فراخوانی بشه و به شمسی تبدیل بشه ، فراخوانی از دیتابیس و تبدیل به شمسی را بخوبی انجام میدم .
اما هنوز نتونستم ساختاری رو بدست بیارم که تاریخ شمسی رو دریافت و بصورت میلادی به فرم YYYY-MM-DD HH:MM:SS در دیتابیس ذخیره کنه .
در انجمن گشتم و تاپیک هایی با این موضوع دیدم ، اما همه اونها فقط کد تبدیل هست و شیوه دریافت از ورودی و ذخیره در دیتابیس جایی نیومده .
از اساتید فن تقاضا دارم حقیر رو در این زمینه راهنمایی کنند .
با تشکر

azowghi
شنبه 27 آبان 1391, 22:36 عصر
سلام دوست عزیز

برو به سایت زیر :

http://amib.ir/weblog/?p=321

با این شما یک فیلد مخفی رو میتونی مقدار دهی کنی البته اتوماتیک خودش این کار رو میکنه و شما مقدار اون رو میگیری و ذخیره میکنی
یا علی

Mohammad-Karimi
شنبه 27 آبان 1391, 22:54 عصر
سلام دوست عزیز

برو به سایت زیر :

http://amib.ir/weblog/?p=321

با این شما یک فیلد مخفی رو میتونی مقدار دهی کنی البته اتوماتیک خودش این کار رو میکنه و شما مقدار اون رو میگیری و ذخیره میکنی
یا علی

از لطف شما سپاسگذارم ، من این تقویم ها و کدهای مشابه زیادی رو دیدم ، اما مشکلم اینه که آشنایی با زبان پی اچ پی ندارم و الان به ناچار روی یک پروژه پی اچ پی دارم کار می کنم .
الان به یک فرم به این شکل نیاز دارم .

<input name="startdate" id="startdate" / >

کاربر تاریخ رو به این فرمت YYYY/MM/DD ، درش وارد کنه البته به شمسی ، که برای این کار یک datepicker بهش اضافه می کنم تا نیاز به ورود دستی نباشه .
تا اینجا هیچ مشکلی وجود نداره ، اما در این مرحله می خوام مقدار ورودی این تگ بصورت معادل میلادی در تیبل events->startdate ذخیره بشه .
اگر دوستانی که با این زبان آشنا هستند کدی می تونند آماده کنند ممنونشون می شم .

rezaonline.net
یک شنبه 28 آبان 1391, 02:41 صبح
یک راهش اینه تبدیلش کنی به timestamp با استفاده از jmktime یا pmktime بعد به شیوه ای که میخوای با استفاده ازdate به میلادی نشونش بدی
همین

thacker
یک شنبه 28 آبان 1391, 04:05 صبح
این فایل رو دانلود و اینکلود کنید توی صفحه مربوطه ... (JDF.PHP (http://jdf.scr.ir/download/))

این رو الان آماده کردم... امیدوارم به کارتون بیاد :



<?php

include_once('jdf.php');;

if(isset($_POST['submit'])) {

$date = $_POST['startdate'];
$year = substr($date, 0, 4);
$month = substr($date, 5, -3);
$day = substr($date, -2);
$startdate = jmktime(0,0,0,$month,$day,$year);

$query = "INSERT INTO `yourtable` (startdate, date) VALUES ('$startdate','$date')";
mysql_query($query);

}


?>

<form action="" method="post">

<input name="startdate" id="startdate" / >
<input type="submit" name="submit">

</form>


فقط دقت کنید ورودی تاریختون حتما باید بصورت YYYY/MM/DD باشه ...
موفق باشید

ravand
یک شنبه 28 آبان 1391, 08:43 صبح
گفتم اینو بهت بگم شاید اطلاع نداری.
اگه خواستی به صورت عدد در خروجی نمایش بدی نیازی نیست به میلادی تبدیل کنی. اول که به شمسی تبدیل کردی به صورت اعداد فارسی تبدیل میشه و شما میای به صورت اعداد انگلیسی تبدیل میکنی و بعد وارد فیلد datetime میکنی.

Mohammad-Karimi
یک شنبه 28 آبان 1391, 21:08 عصر
ممنون از پاسختون .
این برنامه ای که شما نوشتید جواب میده ، اما نه برای کار من .
برنامه رو تست کردم و متوجه شدم که محتویات فرم توسط سیستم تجزیه تحلیل میشه و سپس وارد دیتابیس میشه و پیدا کردن و تغییر این کد ها هم کار آسونی نیست .
تصمیم گرفتم با استفاده از جاوا اسکریپت و jquery محتوای فرم رو بلافاصله پس از دریافت از سمت کلاینت تغییر بدم تا به میلادی ذخیره بشه .

برای این کار از یه کد جاوا اسکریپت استفاده کردم :

<SCRIPT language="JavaScript" type="text/javascript">


var grgSumOfDays=Array(Array(0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365),Array(0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366));
var hshSumOfDays=Array(Array(0, 31, 62, 93, 124, 155, 186, 216, 246, 276, 306, 336, 365), Array(0, 31, 62, 93, 124, 155, 186, 216, 246, 276, 306, 336, 366));

function ToShamsi(grgYear,grgMonth,grgDay,Format)
{
var hshYear = grgYear-621;
var hshMonth,hshDay;

var grgLeap=grgIsLeap (grgYear);
var hshLeap=hshIsLeap (hshYear-1);

var hshElapsed;
var grgElapsed = grgSumOfDays[(grgLeap ? 1:0)][grgMonth-1]+grgDay;

var XmasToNorooz = (hshLeap && grgLeap) ? 80 : 79;

if (grgElapsed <= XmasToNorooz)
{
hshElapsed = grgElapsed+286;
hshYear--;
if (hshLeap && !grgLeap)
hshElapsed++;
}
else
{
hshElapsed = grgElapsed - XmasToNorooz;
hshLeap = hshIsLeap (hshYear);
}

for (var i=1; i <= 12 ; i++)
{
if (hshSumOfDays [(hshLeap ? 1:0)][i] >= hshElapsed)
{
hshMonth = i;
hshDay = hshElapsed - hshSumOfDays [(hshLeap ? 1:0)][i-1];
break;
}
}


if (Format=="Long")
return hshDayName (hshDayOfWeek(hshYear,hshMonth,hshDay)) + " " + hshDay + " " + calNames("hf", hshMonth-1) + " " + hshYear;
else
return hshYear + " /" + hshMonth + " /" + hshDay;
}


function ToGregorian (hshYear,hshMonth,hshDay)
{
var grgYear = hshYear+621;
var grgMonth,grgDay;

var hshLeap=hshIsLeap (hshYear);
var grgLeap=grgIsLeap (grgYear);

var hshElapsed=hshSumOfDays [hshLeap ? 1:0][hshMonth-1]+hshDay;
var grgElapsed;

if (hshMonth > 10 || (hshMonth == 10 && hshElapsed > 286+(grgLeap ? 1:0)))
{
grgElapsed = hshElapsed - (286 + (grgLeap ? 1:0));
grgLeap = grgIsLeap (++grgYear);
}
else
{
hshLeap = hshIsLeap (hshYear-1);
grgElapsed = hshElapsed + 79 + (hshLeap ? 1:0) - (grgIsLeap(grgYear-1) ? 1:0);
}

for (var i=1; i <= 12; i++)
{
if (grgSumOfDays [grgLeap ? 1:0][i] >= grgElapsed)
{
grgMonth = i;
grgDay = grgElapsed - grgSumOfDays [grgLeap ? 1:0][i-1];
break;
}
}

return grgYear+"-"+grgMonth+"-"+grgDay;
}

function grgIsLeap (Year)
{
return ((Year%4) == 0 && ((Year%100) != 0 || (Year%400) == 0));
}

function hshIsLeap (Year)
{
Year = (Year - 474) % 128;
Year = ((Year >= 30) ? 0 : 29) + Year;
Year = Year - Math.floor(Year/33) - 1;
return ((Year % 4) == 0);
}


function hshDayOfWeek(hshYear, hshMonth, hshDay)
{
var value;
value = hshYear - 1376 + hshSumOfDays[0][hshMonth-1] + hshDay - 1;

for (var i=1380; i<hshYear; i++)
if (hshIsLeap(i)) value++;
for (var i=hshYear; i<1380; i++)
if (hshIsLeap(i)) value--;

value=value%7;
if (value<0) value=value+7;

return (value);
}

function hshDayName(DayOfWeek)
{
return calNames("df", DayOfWeek%7);
}

function calNames(calendarName, monthNo)
{
switch (calendarName)
{
case "hf": return Array("فروردين", "ارديبهشت", "خرداد", "تير", "مرداد", "شهريور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند")[monthNo];
case "ge": return Array(" January ", " February ", " March ", " April ", " May ", " June ", " July ", " August ", " September ", " October ", " November ", " December ")[monthNo];
case "gf": return Array("ژانویه", "فوریه", "مارس", "آوریل", "مه", "ژوثن", "ژوییه", "اوت", "سپتامبر", "اكتبر", "نوامبر", "دسامبر")[monthNo];
case "df": return Array("شنبه", "یک‌شنبه", "دوشنبه", "سه‌شنبه", "چهارشنبه", "پنج‌شنبه", "جمعه")[monthNo];
case "de": return Array("Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday")[monthNo];
}
}
</SCRIPT>
<SCRIPT language="JavaScript" type="text/javascript">

/*
Hijri Shamsi (Khayyami)/Gregorian sub-labels calendar
Version 1.1

charset=utf-8

simorgh.ws
*/


function UpdateCalendar(targetId, gregorianMonths, year, month)
{
var newRow, newCell;
var currentDay=1;
var holidays=getHolidays(year, month);
var lastDay=31;
var dtToday=new Date();
var strToday=dtToday.getFullYear()+"-"+(dtToday.getMonth()+1)+"-"+dtToday.getDate();

if (month>6) lastDay--;
if (month==12 && !hshIsLeap(year)) lastDay--;


while (targetId.rows.length>0) targetId.deleteRow(0);


newRow=targetId.insertRow(0);
for (var i=0; i<hshDayOfWeek(year,month,1); i++) newRow.insertCell(-1).innerHTML=" ";
for (var i=hshDayOfWeek(year,month,1); i<7; i++) {
newCell=newRow.insertCell(-1);
newCell.className="normalDay";
newCell.innerHTML="<p class=ShamsiDayNo>" + currentDay + "</p><p dir=ltr class=GregorianDayNo>" + ToGregorian(year,month,currentDay).split("-")[2];
if (holidays.substr(currentDay-1,1)=="x") newCell.className="Holiday";
if (ToGregorian(year, month, currentDay)==strToday) newCell.className="Today";
currentDay++;
}

while (currentDay<=lastDay) {
newRow=targetId.insertRow(-1);
for (var i=0; i<7; i++) {
newCell=newRow.insertCell(-1);
newCell.innerHTML="<p class=ShamsiDayNo>" + currentDay + "</p><p dir=ltr class=GregorianDayNo>" + ToGregorian(year,month,currentDay).split("-")[2];
newCell.className="normalDay";
if (holidays.substr(currentDay-1,1)=="x") newCell.className="Holiday";
if (ToGregorian(year, month, currentDay)==strToday) newCell.className="Today";
currentDay++;
if (currentDay>lastDay) break;
}
}
for (var i=newRow.cells.length; i<7; i++) newRow.insertCell(-1).innerHTML=" ";

if (gregorianMonths != null) {
gregorianMonths.getElementsByTagName('p')[0].innerHTML=calNames("ge", ToGregorian (year,month,1).split("-")[1]-1)+" "+(ToGregorian (year,month,1).split("-")[0])+" - "+calNames("ge", ToGregorian (year,month,30).split("-")[1]-1)+" "+ToGregorian (year,month,30).split("-")[0];
gregorianMonths.getElementsByTagName('p')[1].innerHTML=calNames("gf", ToGregorian (year,month,1).split("-")[1]-1)+" "+(ToGregorian (year,month,1).split("-")[0])+" - "+calNames("gf", ToGregorian (year,month,30).split("-")[1]-1)+" "+ToGregorian (year,month,30).split("-")[0];
}
}

function FillSelectWithMonthNames(targetId)
{
for (var i=0; i<12; i++) {
var mitem = document.createElement("OPTION");
mitem.value=i+1;
mitem.text=calNames("hf", i);
targetId.options.add(mitem);
}
}

function getHolidays(year, month)
{
switch (year) {
case 1380: return Array("xxxx56789x1xx4xxx890123x567890x", "123456x890123x567890x234567x901", "x2xx567890x23xx67x9x1234x678901", "x234567x901234x678901x345678x01", "1234x678901x345678x012345x78901", "xx345678x012345x789012x456789x1", "12345x78x012x456789x12x456x890", "123x56789xx234567x901234x67890", "1x345678x012345x789012x45x789x", "123456x890123x56789xx234567x90", "1234x678901x345678x01x345x7890", "12xx56789x1x3456x890123x5678x")[month-1];
case 1381: return Array("xxxxx678x01xx45x789012x456789x1", "12345x789012x456789xx2x456x8901", "12x45678xx123xx6x890123x567890x", "123456x890123x567890x234567x901", "123x567890x234567x90x234x678901", "x234567x901234x678901x345678xx1", "1234x678901xx45678x012345x789x", "12x456789x123456x890123x567890", "x234x67x901234x678901x345678x0", "12345x78x012x456789x123456x890", "123x567890x234567x901xx4x67890", "xx345678x012345x78901xx45678x")[month-1];
case 1382: return Array("xxxx567x901xx4x678901x345678x01", "12x4x67890xx345678x012345x78x01", "1x345678x0123xxx789012x456789x1", "12345x789012x456789x123456x8901", "12x456789xx23456x890123x567890x", "123456x890123x5678x0x234567x901", "1x3x567890x234567x9x1234x67890", "1x345678x012345x789012x4x6789x", "1234x6x890123x567890x234567xx0", "1234x678901x345678x012345x7890", "12x456789x12x456x890xx3x567890", "x234567x90xx34x678901x345678x")[month-1];
case 1383: return Array("xxxx56x8901xxx567890x234567x901", "123x567890x234567x901234x678901", "x234567x90123xx678901x345678x01", "1234x678901x345678x012345x78901", "1x345678x012345x789012x456789x1", "12345x789012x456789x123456x8901", "12x456789x123456x890123x567890", "x234567x901234x678901x345678x0", "12345x789012x456789x123456x890", "123x567890x234567x901234x67890", "1x345678x012345x78901xx456789x", "123456x890123x567890x234567xx0")[month-1];
}
}

</SCRIPT>
<SCRIPT language="JavaScript" type="text/javascript">
function switchCalendar()
{
var frm = document.getElementById("convert");
var today = new Date();

while (frm.year.options.length<100) frm.year.options.add(document.createElement("OPTION"));

while (frm.month.options.length<12) {
var newMonth = document.createElement("OPTION");
newMonth.value=frm.month.options.length+1;
frm.month.options.add(newMonth);
}

while (frm.day.options.length<31) {
var newDay = document.createElement("OPTION");
newDay.value=frm.day.options.length+1;
newDay.text=frm.day.options.length+1;
frm.day.options.add(newDay);
}

if (frm.calendar[0].checked) {
for (var i=0; i<100; i++) {
frm.year.options[i].text=i+1300;
frm.year.options[i].value=i+1300;
}

for (var i=0; i<12; i++) frm.month.options[i].text = calNames("hf", i);

var shToday = ToShamsi(today.getFullYear(), today.getMonth()+1, today.getDate(),'short');
frm.year.value=Number(shToday.split('/')[0]);
frm.month.value=Number(shToday.split('/')[1]);
frm.day.value=Number(shToday.split('/')[2]);
}
else {
for (var i=0; i<100; i++) {
frm.year.options[i].text=i+1930;
frm.year.options[i].value=i+1930;
}

for (var i=0; i<12; i++) frm.month.options[i].text = calNames("ge", i);

frm.year.value=today.getFullYear();
frm.month.value=today.getMonth()+1;
frm.day.value=today.getDate();
}

convertDate();
}


function convertDate() {
frm = document.getElementById("convert");

if (frm.calendar[0].checked) {
var grg=ToGregorian(parseInt(frm.year.value), parseInt(frm.month.value), parseInt(frm.day.value));
document.getElementById("resultDate").innerHTML = calNames("df", hshDayOfWeek(parseInt(frm.year.value), parseInt(frm.month.value), parseInt(frm.day.value)))+" "+grg.split("-")[2]+" "+calNames("gf", grg.split("-")[1]-1)+" ("+grg.split("-")[1]+") "+grg.split("-")[0];
document.getElementById("resultDate").innerHTML += "<br><font face='tahoma' size=3>"+calNames("de",hshDayOfWeek(parseInt(frm.year.value), parseInt(frm.month.value), parseInt(frm.day.value)))+", "+calNames("ge", grg.split("-")[1]-1)+" "+grg.split("-")[2]+", "+grg.split("-")[0]+"</font>";
}
else {
var hsh=ToShamsi(parseInt(frm.year.value), parseInt(frm.month.value), parseInt(frm.day.value), "Long");
document.getElementById("resultDate").innerHTML=hsh;
}
}
</SCRIPT>


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

<script src="http://code.jquery.com/jquery-1.8.3.min.js">


<script>
$(document).ready(function(){
$("#startdate").change(function(){
var myString = $(this).val();
var stringParts = myString.split("-");
alert(ToGregorian(stringParts[0],stringParts[1],stringParts[2]));
});
});
<script/>


<input name="startdate" id="startdate" / >