Fake Date with Controls

Set a fake date in your browser globally using Tampermonkey with UI controls

// ==UserScript==
// @name         Fake Date with Controls
// @namespace    fake-date-script
// @version      1.3
// @description  Set a fake date in your browser globally using Tampermonkey with UI controls
// @match        http://*/*
// @match        https://*/*
// @grant        none
// @license MIT
// @run-at       document-start
// ==/UserScript==

(function() {
    'use strict';

    // Check if we should use real time
    const useRealTime = localStorage.getItem('fakeDate_useRealTime') === 'true';

    // Use a stored date or the default one
    const storedDate = localStorage.getItem('fakeDateValue') || '2025-04-01T00:00:00.000Z';
    let fakeDateValue = storedDate;
    let fakeDate = new Date(fakeDateValue);
    let fakeTimestamp = fakeDate.getTime();
    let baseTime = Date.now(); // Capture the real time when script loads

    // If useRealTime is true, set timeDifference to 0
    let timeDifference = useRealTime ? 0 : (fakeTimestamp - baseTime);
    const OriginalDate = Date;

    function FakeDate(...args) {
        if (args.length === 0) {
            // Return current fake date when no args provided
            return new OriginalDate(OriginalDate.now() + timeDifference);
        }
        return new OriginalDate(...args);
    }

    // Ensure all static methods are properly copied
    FakeDate.now = function() {
        return OriginalDate.now() + timeDifference;
    };

    FakeDate.parse = OriginalDate.parse;
    FakeDate.UTC = OriginalDate.UTC;

    // Properly copy prototype chain
    FakeDate.prototype = OriginalDate.prototype;
    FakeDate.toString = function() { return OriginalDate.toString(); };
    FakeDate[Symbol.species] = OriginalDate;

    // Override Date
    window.Date = FakeDate;

    // Override performance.now() to align with fake date
    if (window.performance && window.performance.now) {
        const originalNow = window.performance.now.bind(window.performance);
        const perfTimeOrigin = performance.timeOrigin || 0;

        window.performance.now = function() {
            return originalNow() + (timeDifference);
        };

        // Update timeOrigin if it exists
        if ('timeOrigin' in window.performance) {
            Object.defineProperty(window.performance, 'timeOrigin', {
                get: function() {
                    return perfTimeOrigin + timeDifference;
                }
            });
        }
    }

    // Add UI functions
    function updateTimeDisplay() {
        const displayElem = document.getElementById('fake-time-display');
        if (displayElem) {
            displayElem.textContent = `Current Time: ${new Date().toLocaleString()}`;
        }

        // Update status indicator
        const statusElem = document.getElementById('time-status');
        if (statusElem) {
            if (useRealTime) {
                statusElem.textContent = '(REAL TIME)';
                statusElem.style.color = '#4CAF50';
            } else {
                statusElem.textContent = '(FAKE TIME)';
                statusElem.style.color = '#f44336';
            }
        }
    }

    // Create control panel when DOM is ready
    function createControlPanel() {
        // Add styles
        const styles = `
            #fake-date-control {
                position: fixed;
                bottom: 10px;
                right: 10px;
                background: white;
                border: 1px solid #ccc;
                border-radius: 5px;
                padding: 10px;
                z-index: 9999;
                box-shadow: 0 0 10px rgba(0,0,0,0.2);
                font-family: Arial, sans-serif;
                width: 280px;
            }
            #fake-date-control button {
                margin-right: 5px;
                margin-top: 5px;
                padding: 5px 10px;
                border-radius: 3px;
                border: 1px solid #ccc;
                background: #f0f0f0;
                cursor: pointer;
            }
            #fake-date-control button:hover {
                background: #e0e0e0;
            }
            #fake-time-display {
                margin-bottom: 5px;
                font-weight: bold;
            }
            #time-status {
                margin-bottom: 10px;
                font-weight: bold;
            }
            #refresh-page {
                background-color: #4CAF50 !important;
                color: white;
            }
            #reset-date {
                background-color: #f44336 !important;
                color: white;
            }
        `;

        const styleElement = document.createElement('style');
        styleElement.textContent = styles;
        document.head.appendChild(styleElement);

        // Create panel
        const panel = document.createElement('div');
        panel.id = 'fake-date-control';
        panel.innerHTML = `
            <div id="fake-time-display">Current Time: ${new Date().toLocaleString()}</div>
            <div id="time-status">${useRealTime ? '(REAL TIME)' : '(FAKE TIME)'}</div>
            <input type="datetime-local" id="fake-date-input">
            <div>
                <button id="set-date">Set Date</button>
                <button id="reset-date">Reset to Real Time</button>
            </div>
            <div>
                <button id="refresh-page">Refresh Page</button>
                <button id="hide-panel">Hide Panel</button>
            </div>
        `;
        document.body.appendChild(panel);

        // Set initial input value
        const now = new Date();
        const year = now.getFullYear();
        const month = String(now.getMonth() + 1).padStart(2, '0');
        const day = String(now.getDate()).padStart(2, '0');
        const hours = String(now.getHours()).padStart(2, '0');
        const minutes = String(now.getMinutes()).padStart(2, '0');

        document.getElementById('fake-date-input').value = `${year}-${month}-${day}T${hours}:${minutes}`;

        // Add event listeners
        document.getElementById('set-date').addEventListener('click', function() {
            const dateInput = document.getElementById('fake-date-input').value;
            if (dateInput) {
                localStorage.setItem('fakeDateValue', new Date(dateInput).toISOString());
                localStorage.setItem('fakeDate_useRealTime', 'false');
                alert('Date set! Click Refresh to apply changes.');
            }
        });

        document.getElementById('reset-date').addEventListener('click', function() {
            localStorage.setItem('fakeDate_useRealTime', 'true');
            alert('Reset to real time! Click Refresh to apply changes.');
        });

        document.getElementById('refresh-page').addEventListener('click', function() {
            window.location.reload();
        });

        document.getElementById('hide-panel').addEventListener('click', function() {
            panel.style.display = 'none';

            // Create show button
            const showButton = document.createElement('button');
            showButton.textContent = useRealTime ? '🕒' : '🕒*';
            showButton.style.position = 'fixed';
            showButton.style.bottom = '10px';
            showButton.style.right = '10px';
            showButton.style.zIndex = '9999';
            showButton.style.padding = '5px 10px';
            showButton.style.borderRadius = '3px';
            showButton.style.border = '1px solid #ccc';
            showButton.style.background = useRealTime ? '#f0f0f0' : '#ffecec';
            showButton.style.cursor = 'pointer';
            showButton.addEventListener('click', function() {
                panel.style.display = 'block';
                showButton.remove();
            });
            document.body.appendChild(showButton);
        });

        // Update time display every second
        setInterval(updateTimeDisplay, 1000);
    }

    // Create control panel once the DOM is loaded
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', createControlPanel);
    } else {
        setTimeout(createControlPanel, 500);
    }

    console.log('Fake Date script loaded. Current fake date:', new Date().toISOString(), 'Using real time:', useRealTime);
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址