Вот метод расширения, который я использую, чтобы обойти это невероятно разочаровывающее решение. Смотрите примечания, лучший и наиболее эффективный способ справиться с этим - использовать конструктор ticks из DateTimeOffset
вместо того, чтобы выделять другое промежуточное звено DateTime
просто для изменения его свойства Kind
.
/// <summary>
/// Converts a DateTime to a DateTimeOffset, without risking any onerous exceptions
/// the framework quite unfortunately throws within the DateTimeOffset constructor,
/// such as they do when the source DateTime's Kind is not set to UTC. The best and
/// most performant way around this, which we do herein, is to simply construct the
/// new DateTimeOffset with the overload that excepts Ticks. Also, we will simply
/// return <see cref="DateTimeOffset.MinValue"/> if the source DateTime was
/// <see cref="DateTime.MinValue"/>.
/// </summary>
/// <param name="dt">Source DateTime.</param>
/// <param name="offset">Offset</param>
public static DateTimeOffset ToDateTimeOffset(this DateTime dt, TimeSpan offset)
{
// adding negative offset to a min-datetime will throw, this is a
// sufficient catch. Note however that a DateTime of just a few hours can still throw
if (dt == DateTime.MinValue)
return DateTimeOffset.MinValue;
return new DateTimeOffset(dt.Ticks, offset);
}
public static DateTimeOffset ToDateTimeOffset(this DateTime dt, double offsetInHours = 0)
=> ToDateTimeOffset(dt, offsetInHours == 0 ? TimeSpan.Zero : TimeSpan.FromHours(offsetInHours));
Страница, которая должна обновляться в зависимости от содержимого базы данных, должна периодически опрашивать базу данных. Javascript - это клиентская технология, которая не предназначена для прямого взаимодействия с внутренними серверами.
JavaScript будет выглядеть так (с использованием jquery):
$.post("/webroot/checkForChanges.php",
{ currentNumber: currNumString },
function(dat){
$(dat).find('link').each( function() {
$('#linksTable').append(""+$(this).text()+"");
});
});
Это сделает POST-запрос к странице, которую вы напишете (checkForChanges.php) с переменной с именем currentNumber, значение которой является строковым представлением количество ссылок, находящихся в настоящее время в таблице (считайте их, как хотите).
функция (dat) часть кода - это функция обратного вызова, которая запускается, когда запрос завершается (то есть когда страница php завершила обработку и полученный текст был принят в браузер).
Я вернусь к тому, что это делает, когда я объясню, что делает страница PHP.
Вы ничего не сказали нам о структуре своей базы данных, но, поскольку вы успешно разрешаете людям добавлять ссылки, вам необходимо где-то определить последовательность, которая отслеживает целочисленный идентификатор ссылки (чтобы можно было указать каждую ссылку уникальный идентификатор в базе данных). Я предполагаю, что вы назвали это «количество ссылок» Вы должны создать простую php-страницу со следующим псевдокодом:
//open a database connection
$DB = connect( name, user, password );
//receive value
$currNum = $_POST['currentNumber'];
//check to see if sequence number has incremented since last time:
$seqNum = query( "SELECT currval('links-count')" );
if ($seqNum == $currNum){
exit(0);
} //if they are the same, just exit the page without writing anything
//otherwise, carry on... get the result of your query (for new links)
//and loop through, echoing return data
$newEntries = query("SELECT url FROM links WHERE id > ".$currNum);
echo "<newlinks>";
while ( $result = fetch_result( $newEntries ) ) {
echo "<link><a>".$result."</a></link>";
}
echo "</newlinks>";
Результатом, возвращаемым этой страницей, будет XML-документ с узлом для каждой ссылки, содержащей HTML-код, который вы хотите поместить в ячейку таблицы.
Теперь мы можем вернуться к функции обратного вызова в запросе $ .post в вашем клиентском java-коде:
function(dat){
$(dat).find('link').each( function() {
$('#linksTable').append(""+$(this).text()+"");
});
});
dat - это возвращаемый текст, обернуть его как объект jquery, а затем найти коллекцию тегов с именем 'link'. для каждого тега 'link', возвращаемого php-страницей, выполнить функцию, которая добавляет новую строку таблицы в linksTable, которая содержит данные внутри тегов ссылок.
У вас может быть активный javascript на отдельной странице, который в основном опрашивает базу данных на предмет изменений, или вы можете использовать функцию обратного вызова, которая сделает это после успешной отправки. Я не совсем уверен, что здесь происходит, поэтому не знаю, что рекомендовать.