Datum+tijd+Tijdzone omrekenen naar Nederlandse en Canadese tijd.

Status
Niet open voor verdere reacties.

Royzilla

Gebruiker
Lid geworden
10 apr 2014
Berichten
187
Goedemorgen!

Ik heb een vraag en wat hulp nodig. Ik heb een datum selector die prima werkt en als er dan een datum geselecteerd is zet die het als tijd neer in een tekstvak. Deze tijd wordt opgeslagen en verzonden via een email. In de email wil ik ook die tijd omgerekend hebben naar de Nederlandse Tijd en naar een Canadese tijd. Weet iemand misschien hoe het moet als er bijvoorbeeld dit in een tekstvak staat?

06/10/2014 00:00 +0200

Dit zou dan moeten omgerekend worden naar Nederlandse en Canadese tijd. Als het goed is is het al Nederlandse tijd. Maar deze applicatie gaat overal terwereld gebruikt worden dus vandaar.

Alvast bedankt.
 
Als je ze gebruikt als DateTime-object is er niets aan de hand :)

PHP:
// Nederlandse tijd
$date = new DateTime('06/10/2014 00:00', new DateTimeZone('Europe/Amsterdam'));
echo $date->format('Y-m-d H:i:s') . "\n";
// Canadese tijd
$date->setTimezone(new DateTimeZone('Canada/Central'));
echo $date->format('Y-m-d H:i:s') . "\n";
Documentatie DateTime: http://nl1.php.net/datetime

Als je met een database gaat werken moet je dus alle data opslaan op één bepaalde tijdzone.
 
Zou het mogelijk zijn dat je de waarde uit het tekstvak haalt met een $_GET en hem dan omrekent en dat verzend via de mail?
 
Formulieren zou ik altijd via POST verzenden ;)

De vraag is echter hoe weet je welke tijdzone er ingevoerd is? Standaard zal PHP de tijdzone van de server nemen.

Maar als ik in Canada mijn lokale tijd in ga voeren en de server staat in Nederland dan wordt dat dus niet onder de Canadese tijdzone opgevat.

Dan heb je twee opties, je stelt per ingelogde gebruiker een tijdzone vast (Of die kan een gebruiker zelf aanpassen) of je moet de tijdzone in je formulier opnemen.
 
tekstvak2.PNG
Hier zie je hoe ik het heb, er kan een timezone geselecteerd worden en als het dan zo in de tekstbox komt
06/10/2014 00:00 +0200

zou het omgerekent moeten worden en mij lijkt het dat het kan? maar hoe ik zou het niet weten.
 
Probeer dit eens:
PHP:
$date = DateTime::createFromFormat('m/d/Y H:i O', '06/10/2014 00:00 +0200');
var_dump($date->getTimezone());

Het format hangt natuurlijk af van de manier waarop je het binnen je jQuery plugin laat noteren.
 
Zou je me kunnen helpen dat de datum die in de database wordt gezet altijd een UTC datum is? dus de tijdzone moet daarnaar omgerekend worden.

Dus ik moet iets hebben dat de output van de datetimepicker converteert naar UTC. (dus zonder dat er een timezone ofsset in de date/time staat (+0200 bijvoorbeeld))

enig idee?
 
Aangezien ook MySQL een tijdzone instelling heeft moet je er voor zorgen dat deze bekend is. Het is namelijk niet mogelijk de tijdzone bij je DATETIME of TIMESTAMP type op te slaan.

Als je instelt dat MySQL op tijdzone Europe/Amsterdam staat dan moet je de data dus ook converteren:
PHP:
$date = DateTime::createFromFormat('m/d/Y H:i O', '06/10/2014 00:00 +0200');
$date->setTimezone(new DateTimeZone('Europe/Amsterdam'));

Ongeacht de ingevoerde tijdzone zal $date nu altijd de waarde in de tijdzone van Europe/Amsterdam teruggeven :)

Voer voor de zekerheid een aantal tests uit om te verifiëren dat het goed gaat.

[edit]Om er altijd zeker van te zijn kun je een extra kolom opnemen in je tabel met de tijdzone[/edit]
 
Laatst bewerkt:
Hoe moet ik dat stuk dan koppelen want de jquery bestanden zijn javascript.
Code:
<script>
	var startDateTextBox = $('#startDate');
	var endDateTextBox = $('#endDate');
  //var tmpDateTextBox = $('#tmpDate');
	var maxOffset = 0;

	startDateTextBox.datetimepicker({ 
		timeFormat: 'HH:mm z',
		minDate: 1,
		onClose: 
			function(dateText, inst) {
					var StartDate = startDateTextBox.datetimepicker('getDate');
					var newDate = new Date(StartDate.getFullYear(), StartDate.getMonth(), StartDate.getDate()+7) ;
					var currentDate = new Date();
					var maximDate = dateFormat(newDate,"mm/dd/yyyy hh:mm o");
					maxOffset = days_between(newDate, currentDate);
					//document.write(maxOffset);
					$('#endDate').val(maximDate);
					endDateTextBox = $('#endDate');
				    $("#endDate").datepicker("change",{ maxDate: new Date($('#endDate').val()) } );
				},
		onSelect: function (selectedDateTime){
			endDateTextBox.datetimepicker('option', 'minDate',startDateTextBox.datetimepicker('getDate') );
		}
	});

	
	endDateTextBox.datetimepicker({ 
    	timeFormat: 'HH:mm z',
    	//showTimezone: false,
    	//timezoneList: false,
		minDate: 1,
		//maxDate: new Date(newDate),
    	onClose: 
			function(dateText, inst) {
    			//if (startDateTextBox.val() != '') {
    		    // var endDate = startDateTextBox.datetimepicker('getDate');
    			var EndDate = endDateTextBox.datetimepicker('getDate');
    			//	if (testStartDate > testEndDate)
    			//		startDateTextBox.datetimepicker('setDate', testEndDate);
    			//}
    			//else {
    			//	startDateTextBox.val(dateText);
    			//}
    		},
    		onSelect: function (selectedDateTime){
    		//startDateTextBox.datetimepicker('option', 'maxDate', '+7d' );
    		//var tempDate = new Date(endDateTextBox.datetimepicker('getDate'));
    		//startDateTextBox.datetimepicker('option', 'maxDate',  tempDate.setDate(tempDate.getDate() + 7));
    		}
    	});

</script>
 
Niet, aangezien het op je verwerkpagina moet komen :)

Je gebruikt de datetimepicker in een formulier nietwaar?
Dat formulier ga je verzenden naar een pagina gedefineerd in je action="", op die pagina moet je de waarde vanuit het formulier invoeren op de plek waar nu '06/10/2014 00:00 +0200' staat.
 
Als alles ingevuld is en op de button geklikt wordt wordt de pagina opnieuw opgeroepen en wordt de mail meteen verzonden. er staat namelijk in action="<?php echo $_SERVER['PHP_SELF']; ?>".
 
$_SERVER['PHP_SELF'] is voor zover ik weet nooit 100% betrouwbaar.

Hetzelfde resultaat kun je bereiken door gewoon de action leeg te laten (action="") :)

Blijkbaar wordt het formulier dus op dezelfde pagina afgehandeld, er zal dus ergens
PHP:
if($_SERVER['REQUEST_METHOD'] == 'POST')
moeten staan.

Er zullen in ieder geval ergens $_POST-variabelen in die PHP-pagina gebruikt worden.

Het gedeelte tussen de controle of een formulier is verzonden en het aanroepen van je mail-functie is dus van belang en daar ergens dien je dus de code te plaatsen :)
 
Fatal error: Call to a member function setTimezone() on a non-object in

Die error krijg ik waar ik hem plaats.
 
Dat geeft aan dat er geen DateTime-object gegenereerd is.

Hoe ziet je code er uit? (Het gedeelte qua formulier-afhandeling)
 
Fatal error: Call to a member function setTimezone() on a non-object in
Deze melding houdt in dat de function "setTimezone()" aangeroepen wordt op iets dat geen object is.

Hoe ziet je code er uit, het gedeelte na
PHP:
if($_SERVER['REQUEST_METHOD'] == 'POST')
 
PHP:
if ($_SERVER['REQUEST_METHOD'] == 'GET') {
$mySelect = $_GET['selectForm'];
}
Ik gebruik get als ik dit verander in post op alle gedeeltes maar dan ook overal dan pakt die niet de dingen uit de database die getoont moeten worden op sommige plekken.
 
Dat je GET gebruikt voor database vragen is geen probleem en is normaal maar voor formulieren zou ik je willen adviseren altijd POST te gebruiken.

Waar is het gedeelte waarmee je de mail gaat versturen? Dat wordt immers uitgevoerd zodra je het formulier laat verzenden nietwaar?

Plaats anders de volledige inhoud van het bestand indien dat mogelijk is.
 
PHP:
	// Controleer of alles is ingevuld 
								if ( isset($_GET['send']) )  
								{
									
									// Alles is ingevuld, de mail kan verstuurd worden
									$to = 'mail';
									$onderwerp = 'test';
									$bericht   = "<html><body>";
									$bericht  .= "<table rules='all' style='border-color: red;' ";
									$bericht  .= "<tr><td>Status: </td><td width='350px'>".($_GET['status']). "</td></tr>";
									$bericht  .= "<tr><td>Reason: </td><td width='350px'>".($_GET['reason']). "</td></tr>";
									$bericht  .= "<tr><td>Explanation: </td><td width='350px'>".($_GET['data']). "</td></tr>";
									$bericht  .= "<tr><td>Country name: </td><td width='350px'>".($_GET['country_name']). "</td></tr>";
									$bericht  .= "<tr><td>Site name: </td><td width='350px' >".($_GET['site_name']). "</td></tr>";
									$bericht  .= "<tr><td>Server name: </td><td width='350px'>";
									for($i=0; $i < count($checked); $i++)
									{
										if ($i)
										{
											$bericht.=", ";
										}
										else
										{
											$bericht.=" ";
										}
										$bericht.=$checked[$i];
									}   "</td></tr>";
									$bericht  .= "<tr><td>Start down time: </td><td width='350px'>".($_GET['startDate']). "</td></tr>";
									$bericht  .= "<tr><td>End down time: </td><td width='350px'>".($_GET['endDate']). "</td></tr>";
									$bericht  .= "<tr><td>Exception: </td><td width='350px'>".($_GET['exception']). "</td></tr>";
									$bericht  .= "<tr><td>Request ID: </td><td width='350px'>".($_GET['request_id']). "</td></tr>";
									$bericht  .= "<tr><td>Name: </td><td width='350px'>".($_GET['hostname']). "</td></tr>";
									$bericht  .= "<tr><td>Phone number: </td><td width='350px'>".($_GET['phone']). "</td></tr>";
									$bericht  .= "<tr><td>Email: </td><td width='350px'>".($_GET['email']). "</td></tr>";
									$bericht  .= "<tr><td>Extra information: </td><td width='350px'>".($_GET['information']). "</td></tr>";
									$bericht  .= "</table>";
									$bericht  .=  getUrl() .$URL;
									$bericht  .= "</body></html>";
									$headers   = 'MIME-Version: 1.0' . "\r\n";
									$headers  .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
									$headers  .= "From: ".htmlspecialchars($_GET['email'])."\r\n";
									$headers  .= "CC: ".htmlspecialchars($_GET['email'])."\r\n";
										
									mail($to, $onderwerp, $bericht, $headers);
								}

Dit is de mail.
 
Ik ben zelf altijd voorstander van leesbaarheid dus ik zou het zo doen:
PHP:
<?php
// Controleren of er een formulier is verzonden
if($_SERVER['REQUEST_METHOD'] == 'POST') {
    // Controleer of alles is ingevuld
    /*---- Controles hier ----*/
    
    // De for-lus kan vermeden worden door implode te gebruiken
    $servers = implode(', ', $checked);
    
    // Data manipuleren
    $startDate = DateTime::createFromFormat('m/d/Y H:i O', $_POST['startDate']);
    $endDate = DateTime::createFromFormat('m/d/Y H:i O', $_POST['endDate']);
    
    // In welk format moet het in de mail getoond worden?
    $outputDateFormat = 'm/d/Y H:i O';
    
    $to = 'mail';
    $onderwerp = 'test';
    
    $bericht =
    '<html>
        <body>
            <table rules="all" style="border-color: red;">
                <tr>
                    <td>Status:</td>
                    <td width="350px">'. $_POST['status'] .'</td>
                </tr>
                <tr>
                    <td>Reason:</td>
                    <td>'. $_POST['reason'] .'</td>
                </tr>
                <tr>
                    <td>Explanation:</td>
                    <td>'. $_POST['data'] .'</td>
                </tr>
                <tr>
                    <td>Country name:</td>
                    <td>'. $_POST['country_name'] .'</td>
                </tr>
                <tr>
                    <td>Site name:</td>
                    <td>'. $_POST['site_name'] .'</td>
                </tr>
                <tr>
                    <td>Server name:</td>
                    <td>'. $servers .'</td>
                </tr>
                <tr>
                    <td>Start down time:</td>
                    <td>'. $startDate->format($outputDateFormat) .' '. $startDate->getTimezone() .'</td>
                </tr>
                <tr>
                    <td>End down time:</td>
                    <td>'. $endDate->format($outputDateFormat) .' '. $endDate->getTimezone() .'</td>
                </tr>
                <tr>
                    <td>Exception:</td>
                    <td>'. $_POST['exception'] .'</td>
                </tr>
                <tr>
                    <td>Request ID:</td>
                    <td>'. $_POST['request_id'] .'</td>
                </tr>
                <tr>
                    <td>Name:</td>
                    <td>'. $_POST['hostname'] .'</td>
                </tr>
                <tr>
                    <td>Phone number:</td>
                    <td>'. $_POST['phone'] .'</td>
                </tr>
                <tr>
                    <td>Email:</td>
                    <td>'. $_POST['email'] .'</td>
                </tr>
                <tr>
                    <td>Extra information:</td>
                    <td>'. $_POST['information'] .'</td>
                </tr>
            </table>
            '. getUrl() .$URL .'
        </body>
    </html>
    ';
    
    $headers   = 'MIME-Version: 1.0' . "\r\n";
    $headers  .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
    $headers  .= "From: ".htmlspecialchars($_POST['email'])."\r\n";
    $headers  .= "CC: ".htmlspecialchars($_POST['email'])."\r\n";
    
    if(mail($to, $onderwerp, $bericht, $headers)) {
        // Mail is verzonden
    } else {
        // Probleem met verzenden van mail
    }
}

In bovenstaande code wordt de tijdzone nog niet gemanipuleerd
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan